概述
先进先出的线性序列被称为栈,它是一种被限制的线性表,只能在一端进出操作进出的一端称占顶,另一端称栈底,栈可以用顺序存储,也可以用链式存存储,分别称为顺序栈和链栈。
1.初始化栈
可以看到base指向第一个元素的地址,top指向最后一个元素的下一个单元的地址
栈的最初状态是栈顶指针指向栈底
typedef struct SqStack
{
int* top;
int* base;
}SqStack;
//构造空栈
bool InitStack(SqStack& S)
{
S.base = new int[Maxsize];
//在堆区申请一块足够大的内存 将地址赋值给栈底指针
if (!S.base)
{
cout << "构造失败" << endl;
return false;
}
S.top = S.base;
return true;
}
2.入栈
(1)入栈前需要检验栈是否满了
条件是当栈顶指针减栈底指针等于最大栈容量时栈就满了
tips:可能有人会有疑问 int型不是占用4个字节吗?top-base应该等于400,为什么等于100.
这里的400中的1代表一个字节
而top-base=100中的1代表的是指针的步长,一个步长占有4字节.
(2)*S.top先将栈顶指针指向的空间拿到再赋值,最后做栈顶指正的后移 所以综合为*S.top++=e;
//入栈
bool Push(SqStack& S, int e)
{
if ((S.top - S.base) == Maxsize)
{
cout << "栈满" << endl;
return false;
}
*S.top++ = e;//先将栈顶指针解引用 赋值后 再使栈顶指正上移
return true;
}
3.出栈
(1)栈无元素时不可出栈 判断条件就是栈的初始状态 栈顶指正指向栈底
(2)因为栈顶指针并未指向栈顶元素 所以需要将指针做减1操作然后解引用其指向的空间取得元素,赋值给e,最后将栈顶指针下移 综合为e = *(--S.top)
bool Pop(SqStack& S, int& e)
{
if (S.base == S.top) //栈无元素
{
cout << "栈空" << endl;
return false;
}
e = *(--S.top);
//相当于
//e = * (S.top - 1); 指针减一并未使指针移动 取栈顶元素
//S.top--; //指正下移实际操作
return true;
}
3取栈顶元素
和出栈是一个道理,不过多赘述
int GetTop(SqStack S)
{
if (S.top != S.base)
{
return *(S.top - 1); //取栈顶元素
}
else
{
return -1;
}
}
4要注意,遍历栈中元素是属于质变遍历 破坏了原有的数据,而像一些非质变遍历例如冒泡,插入,并归排序,都属于非质变排序.
综合代码如下
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
using namespace std;
const int Maxsize = 100;//尽量用const替换#define
struct SqStack
{
int* top; //栈顶指针
int* base;//栈底指针
};
//构造空栈
bool InitStack(SqStack& S)
{
S.base = new int[Maxsize];
//在堆区申请一块足够大的内存 将地址赋值给栈底指针
if (!S.base)
{
cout << "构造失败" << endl;
return false;
}
S.top = S.base;
return true;
}
//入栈
bool Push(SqStack& S, int e)
{
if ((S.top - S.base) == Maxsize)
{
cout << "栈满" << endl;
return false;
}
*S.top++ = e;//先将栈顶指针解引用 赋值后 再使栈顶指正上移
return true;
}
bool Pop(SqStack& S, int& e)
{
if (S.base == S.top) //栈无元素
{
cout << "栈空" << endl;
return false;
}
e = *(--S.top);
//相当于
//e = * (S.top - 1); 指针减一并未使指针移动 取栈顶元素
//S.top--; //指正下移实际操作
return true;
}
int GetTop(SqStack S)
{
if (S.top != S.base)
{
return *(S.top - 1); //取栈顶元素
}
else
{
return -1;
}
}
int main()
{
SqStack S;
InitStack(S);
cout << "请输入元素个数" << endl;
int n = 0;
cin >> n;
for (int i = 0; i < n; i++)
{
int e;
cin >> e;
Push(S, e);
}
cout << "栈的元素输出" << endl;
for (int i = 0; i < n; i++)
{
int e = 0;
Pop(S, e);
cout << e << " ";
}
cout << endl;
system("pause");
return EXIT_SUCCESS;
}