顺序栈具体定义实现,以及创建顺序栈的实现代码
通过创建结构体实现顺序栈,结构体包含节点的主要信息,包括数组和一个栈顶指针,下面是一段节点定义代码,定义了一个节点结构体。主要为了展示操作逻辑,直接在栈区创建顺序栈对象,以便减少不必要的脑算力开支
#include <iostream>
using namespace std;
#define maxsize 5
struct SeqStack{
int data[maxsize];
int top;
};
SeqStack S;
bool empty(SeqStack &S) {//判断栈指针是-1,如果是就是空栈
return S.top == -1;
}
void Seqstack(SeqStack &S) {//传一个指针进去
S.top = -1;//操纵堆区对象指针指向-1
cout << "已建新栈" << endl;
}
压栈函数接受一个栈对象引用,和一个数值。函数先完成空栈检测,通过后就是核心代码,因为初始指针top为-1,所以是先指针位移,再进行赋值运算。
void Push(SeqStack &S, int value) {//传入一个指针和一个数值
if (S.top == maxsize - 1) {
cout << "本栈已满,数据不予压入" << endl;
return;
}
cout << "压入 " << value;
S.data[++S.top] = value;//先加加在赋值
cout << " 当前指针为"<<S.top << " " << endl;
}
弹栈函数传入一个栈对象引用,先做空栈检测,然后弹出数据,庆祝注意指针初始位置,-1的话是先传值再将指针-1
int Pop(SeqStack &S) {//传入一个引用
if (empty(S)) {//判断是否空栈
cout << "栈空,无数据" << endl;
return 0;
}
cout << "弹出 " << S.data[S.top];
cout << " 当前指针为 " << S.top-1 << endl;
return S.data[S.top--];//先传值再减减
}
传入一个栈对象引用,取栈顶数据,也就是当前指针指向的数据,此函数不弹出数据,核心代码前依旧是做空栈检测
int GetTop(SeqStack &S) {//得到栈顶指针指向的值
if (empty(S)) {//判断是否空栈
cout << "栈空,无数据" << endl;
return 0;
}
cout << "栈顶数据为 "<<S.data[S.top] << endl;;
return S.data[S.top];//得到当前指针指向的值
}
因为是在内存栈区建立对象,无法动态扩容,故没有记录Resize函数,若有需求可以自行修改代码(反正核心代码不变就没问题),下面是一段可供测试的代码
void test() {
Seqstack(S);
Push(S, 3);
Push(S, 4);
Push(S, 7);
Push(S, 2);
Push(S, 9);
Push(S, 3);
Pop(S);
Pop(S);
GetTop(S);
}
直接在main()里调用test()就行