栈
栈的逻辑结构是一种线性表,只能从栈顶增加和删除元素即只能从一端插入或删除元素,遵守先进后出原则。
顺序栈:
用顺序存储方式实现栈,与顺序表类似,通过数组来实现。而栈最重要的就是栈顶,所以定义栈时,一定要定义一个top指针指明栈顶,有多种方式来定义,如:
内存
4 | |
---|---|
3 | |
2 | data[2]---top |
1 | data[1] |
0 | data[0] |
或者为
4 | |
---|---|
3 | top |
2 | data[2] |
1 | data[1] |
0 | data[0] |
两者区别在于,下标从0开始所以第一种在栈为空时,top可以看做指向-1,top指向此时栈中 最后一个元素Maxsize-1;
而第二种则是指向栈中最后一个元素的后一位,即当栈空时top指向0,栈满top指向Maxsize
代码实现顺序栈(采用第一种定义方式):
定义:
typedef struct {
int data[Maxsize];
int top;//栈顶指针
}SqStack;
初始化:
bool InitStack(SqStack& S)
{
S.top = -1;//刚开始栈内没有元素,top指向-1
cout << "初始化完成" << endl;
return true;
}
插入元素e(进栈):
bool PushStack(SqStack& S,int e)
{
if (S.top == Maxsize - 1)
{
cout << "栈满" << endl;
return false;
}
S.top += 1;
S.data[S.top] = e;
cout << "入栈成功" << endl;
return true;
}
删除元素(出栈):
int PopStack(SqStack& S)
{
EmptyStack(S);
int e;//记录被删除的栈顶元素
e = S.data[S.top];
S.top -= 1;
cout << "出栈元素为:" << e << endl;
return e;
}
返回当前栈顶元素:
int GetTop(SqStack S)
{
EmptyStack(S);
cout << "当前栈顶元素为:" << S.data[S.top] << endl;
return S.data[S.top];
}
栈的判空操作:
bool EmptyStack(SqStack S)
{
if (S.top == -1)
{
cout << "栈空" << endl;
return true;
}else
return false;
}
遍历栈中元素:
void PrintStack(SqStack S)
{
for (int i = 0; i < S.data[S.top]; i++)
{
cout << S.data[i] << " ";
}
cout << endl;
}
运行测试结果: