目录
1.顺序栈
#include <iostream>
using namespace std;
#define MaxSize 128
typedef int ElemType;
typedef struct SqStack{//定义顺序栈的栈点结构体
ElemType data[MaxSize];//存放栈中元素
int top; //栈顶指针
}SqStack;
//顺序栈
bool InitStack(SqStack& S) {//初始化栈
S.top = -1;//初始化栈顶指针
return true;
}
bool StackEmpty(SqStack S) {//是否为空栈
if (S.top == -1) {//栈顶指针指向栈尾指针,空栈!
cout << "该栈是个空栈!" << endl;
return true;
}//栈空
return false;
}
bool Push(SqStack& S) {//入栈操作
if (S.top == MaxSize - 1) {//判断是否栈满
cout << "栈已满" << endl;
return false;
}
cin >> S.data[++S.top];//若栈未满向其中填入数据,栈顶指针先向后移动,在填入数据
return true;
}
bool Pop(SqStack& S) {//出栈
if (S.top == -1) {//判断是否是空栈
cout << "该栈是个空栈!" << endl;
return false;
}
cout << " " << S.data[S.top--];//若不是空栈,先输出数据在移动栈顶指针
return true;
}
int main() {
SqStack S;
InitStack(S);
int x;
cout << "请输入你要入栈的个数";
cin >> x;
while (x)
{
Push(S);
x--;
}
int y;
cout << "请输入你要出栈的个数";
cin >> y;
while (y)
{
Pop(S);
y--;
}
}
顺序栈的运行结果及截图
2.链栈
#include <iostream>
typedef struct StackNode
{
ElemType data; //数据域
struct StackNode* next; //指针域
}StackNode;
typedef StackNode* LinkStacklink; //链栈指针
void InitStacklink(LinkStacklink* s)//初始化
{
*s = NULL;
}
//入栈
void Pushlink(LinkStacklink* s)
{
//为栈结点分配空间
StackNode* t = new StackNode;
//将数据存入这个栈结点
cin>>t->data;
if (*s == NULL) //如果链栈里面的结点为空
{
*s = t; //将链栈的指针指向这个结点
t->next = NULL;
}
else //如果栈里面已经有结点,直接进行头插
{
t->next = *s;//将新结点连接上之前的结点
*s = t;//将栈指针指向最新的栈结点
}
}
//出栈
void Poplink(LinkStacklink* s)
{
StackNode* p = *s;
//指向新的栈顶
*s = p->next;
cout<<" " << p->data;
//删除结点
free(p);
p = NULL;
}
int main() {
LinkStacklink st;
int x;
cout << "请输入你要入栈的次数:";
cin >> x;
while (x) {
Pushlink(&st);
x--;
}
int y;
cout << "请输入你要出栈的次数:";
cin >> y;
while (y)
{
Poplink(&st);
y--;
}
}
链栈的运行结果及截图
3.共享栈
#include<iostream>
typedef struct {
ElemType data[MaxSize];
int top0;
int top1;
}ShareStack;
void InitShareStack(ShareStack* shstack)
{
shstack->top0 = -1; //初始化0号栈的栈顶指针为-1,此时1号栈为空
shstack->top1 = MaxSize; //同理栈顶指针为MaxSize时,1号栈为空
}
int EmptySharaStack(ShareStack shstack)//空栈判断
{
if (shstack.top0 == -1 && shstack.top1 == MaxSize)
{
return -2; //两个栈都空时,返回--2
}
else if (shstack.top0 == -1)
{
return -1;//0号栈为空,1号栈非空时,返回-1
}
else if (shstack.top1 == MaxSize)
{
return 0; //1号栈为空,0号栈非空时,返回0
}
return 1; //两个栈都非空时,返回1
}
//0号栈入栈
bool PushTop0(ShareStack* shstack)
{
if ((shstack->top1 - shstack->top0) == 1) //栈满,报错
{
return false;
}
shstack->top0++; //0号栈顶指针先加1
cin>>shstack->data[shstack->top0]; //元素入栈
return true;
}
//1号栈入栈
bool PushTop1(ShareStack* shstack)
{
if ((shstack->top1 - shstack->top0) == 1) //栈满,报错
{
return false;
}
shstack->top1--; //1号栈顶指针先减一
cin>>shstack->data[shstack->top1]; //元素入栈
return true;
}
//0号栈出栈
bool PopTop0(ShareStack* shstack)
{
if (shstack->top0 == -1) //1号栈空,报错
{
return false;
}
cout<<" "<< shstack->data[shstack->top0]; //栈顶元素先出栈
shstack->top0--; //栈顶指针再减1
return true;
}
//1号栈出栈
bool PopTop1(ShareStack* shstack)
{
if (shstack->top1 == MaxSize) //1号栈空,报错
{
return false;
}
cout<<" "<<shstack->data[shstack->top1]; //栈顶元素先出栈
shstack->top1++; //栈顶指针再加1
return true;
}
int main(){
ShareStack L;
InitShareStack(& L);
//0号栈入栈
cout << "请输入要输入0号栈要入栈的个数:";
int x;
cin >> x;
cout << "请分别输入要入0号栈的值:";
while (x)
{
PushTop0(&L);
x--;
}
cout << "请输入要输入0号栈要出栈的个数:";
int y;
cin >> y;
while (y)
{
PopTop0(&L);
y--;
}
//1号栈入栈
cout << endl;
cout << "请输入要输入1号栈要入栈的个数:";
int p;
cin >> p;
cout << "请分别输入要入1号栈的值:";
while (p)
{
PushTop1(&L);
p--;
}
cout << "请输入要输入1号栈要出栈的个数:";
int q;
cin >> q;
while (q)
{
PopTop1(&L);
q--;
}
}