王道数据结构源码实战自学-栈(c++版)
- 初始化的时候 top为 -1
- 栈顶top 等于 MaxSize-1时栈满
#include <iostream>
using namespace std;
#define MaxSize 50
typedef int ElemType;
//定义栈的结构体
typedef struct {
ElemType data[MaxSize];
int top;
}SqStack;
1 初始化函数
初始化就是将栈的top置为-1
//初始化栈
void InitStack(SqStack& S) {
S.top = -1;
}
2 判断栈是否为空
就是判断栈的top是否为 -1
//判断栈空
bool StackEmpty(SqStack S) {
if (S.top == -1) {
return true;
}
return false;
}
3 入栈
入栈的时候首先要判断栈是否为空的
其次注意的是:往栈里面插入值的时候,中括号里是 ++S.top,这样top也实现了自增。++i返回的是加一后的值
拓展:i++ 和 ++i的区别
#include <iostream> using namespace std; int main() { int i = 1; cout << i++ << endl;//1 int j = 1; cout << ++j << endl;//2 }
1、 i++ 返回原来的值,++i 返回加1后的值。
2、 i++ 不能作为左值,而++i 可以。
测试:插入1 2 3,查看内存情况
//入栈
bool Push(SqStack& S, ElemType x) {
if (S.top == MaxSize - 1) {
return false;
}
S.data[++S.top] = x;
return true;
}
4 获取栈顶元素
只拿元素,不弹栈
提前声明一个变量 x 来接收栈顶元素,所以函数的返回值为bool类型,传参的时候引用x
测试例子:创建一个栈,入栈 1 2 3 ,获取栈顶元素,查看内存
//获取栈顶元素
bool GetTop(SqStack S, ElemType& x) {
if (S.top == -1)
{
return false;//栈为空
}
x = S.data[S.top];
return true;
}
5 出栈
既拿元素 又修改栈
这里也是提前声明一个变量 x,让它来接收弹出的元素
代码实现过程中,使用了i–的操作,类似于i++。
//弹栈
bool Pop(SqStack& S, ElemType& x) {
if (S.top == -1) {
return false;//栈为空
}
x = S.data[S.top--];//简化的操作,先获取到当前的top,然后对top操作减一
//x = S.data[S.top--]; 还可以写成如下样式
//x = S.data[S.top];
//S.top--;
return true;
}
6 链表实现栈 - 链栈
在考研中相对来说重要性不大
原理:就是在链表中使用 头部插入法 头部删除法