目录
顺序栈的存储方式
同一般线性表的顺序存储结构完全相同,利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素。栈底一般在低地址端。
·附设top指针,指示栈顶元素在顺序栈中的位置。
·另设base指针,指示栈底元素在顺序栈中的位置。
但是,为了方便操作,通常top指示真正的栈顶元素之上的下标地址
另外用stacksize表示栈可使用的最大容量
顺序栈存储的特点
简单、方便、但是容易溢出(数组大小固定)
栈空、栈满定义
base == top 是栈空的标志
top - base == stacksize 是栈满的标志。
具体栈空、栈满的示意图如下
栈满时的处理方法
1.报错,返回系统
2.分配更大的空间,作为栈的存储空间,将原栈的内容移入新栈
上溢、下溢定义
上溢:栈已经满,又要压入元素
下溢:栈已经空,还要弹出元素
(注:上溢是一种错误,使问题的处理无法进行;而下溢一般认为是—种结束条件,即问题处理结束。)
顺序栈功能函数
bool InitStack(SqStack &S); //1.栈的初始化
bool StackEmpty(SqStack S); //2.判断是否为空
int StackLength(SqStack S); //3.求栈的长度
void DestroyStack(SqStack &S); //4.销毁栈
void ClearStack(SqStack &S); //5.清空顺序栈
bool Push(SqStack &S, ElemType e); //6.入栈
bool Pop(SqStack &S, ElemType &e); //7.出栈
bool Gettop(SqStack &S, ElemType &e); //8.得到栈顶元素
代码实现
#include<bits/stdc++.h>
using namespace std;
#define MAXSIZE 100
typedef int ElemType;
typedef struct SqStack {
ElemType *base;
ElemType *top;
int stacksize;
}SqStack;
//初始化栈
bool InitStack(SqStack &S) {
S.base = new ElemType[MAXSIZE];
if(!S.base) //存储分配失败
exit(-1);
S.top = S.base;
S.stacksize = MAXSIZE;
return true;
}
//判定栈是否为空
bool StackEmpty(SqStack S) {
if(S.base == S.top)
return true;
return false;
}
//求栈的长度
int StackLength(SqStack S) {
return S.top-S.base;
}
//销毁栈
void DestroyStack(SqStack &S) {
if(S.base) {
delete S.base;
S.stacksize = 0;
S.top = S.base = NULL;
}
}
//清空顺序栈
void ClearStack(SqStack &S) {
if(S.base) {
S.top = S.base;
}
}
//入栈
bool Push(SqStack &S, ElemType e) {
if(S.top - S.base == S.stacksize)
return false;
*S.top++ = e;
return true;
}
//出栈
bool Pop(SqStack &S, ElemType &e) {
if(S.base == S.top)
return false;
e = *--S.top;
return true;
}
//得到栈顶元素
bool Gettop(SqStack &S, ElemType &e) {
if(S.base == S.top)
return false;
e = *S.top;
return true;
}
int main() {
int n;
ElemType e;
SqStack st;
InitStack(st);
cout << "栈已经初始化" << endl;
cout << "请输入栈中元素个数:" << endl;
cin >> n;
cout << "请依次输入栈中元素:" << endl;
for(int i = 0; i < n; i++) {
cin >> e;
Push(st, e);
}
cout << "此时栈的长度为:" << StackLength(st) << endl;
cout << "取出栈中所有元素:";
for(int i = 0; i < n; i++) {
Pop(st, e);
cout << e << " ";
}
cout << endl;
cout << "此时栈的长度为:" << StackLength(st) << endl;
cout << "在栈中加入一个元素:" << endl;
cin >> e;
Push(st, e);
cout << "此时栈顶元素为:" << e << endl;
Gettop(st, e);
cout << "此时栈的长度为:" << StackLength(st) << endl;
cout << "清空栈" << endl;
ClearStack(st);
cout << "此时栈的长度为:" << StackLength(st) << endl;
DestroyStack(st);
return 0;
}