数据结构3:栈:顺序栈、双向栈(C语言版)
·
目录
一、顺序栈
1.顺序栈的类型定义
#define MAXSIZE 100
typedef int Elemtype;
typedef struct
{
Elemtype data[MAXSIZE];
int top;
}SeqStack;
SeqStack S;
我们采用的方式比将top和base定义成指针更为方便!
2.构造一个空顺序栈
int Stackinit(SeqStack &S)
{
S.top=-1; //这里我们也可以将S.top置为0,和-1的区别就在于-1是将top更新到元素所在位置,而0是将top更新到元素的上一个位置
return 1;
}
3.判断栈是否为空
int StackEmpty(SeqStack S)
{
if(S.top==-1)
{
cout<<"栈空";
return 1;
}
else
return 0;
}
4.入栈:插入元素x为栈顶元素
int StackPush(SeqStack &S,Elemtype x) //这里注意我们要改S的data和top,所以加&
{
if(S.top==MAXSIZE-1)
{
cout<<"栈满";
return 0;
}
else
{
S.data[++S.top]=x;
return 1;
}
}
5.出栈并返回栈顶元素
int StackPop(SeqStack &S,Elemtype &x)
{
if(S.top==-1)
{
cout<<"栈空";
return 0;
}
else
{
x=S.data[S.top--];
}
return 1;
}
6.取栈顶元素
Elemtype StackGetTop(SeqStack S) //最好将返回类型写成Elemtype,因为返回的是元素的类型
{
return S.data[S.top];
}
二、双向栈
1.双向栈的类型定义
typedef struct
{
Elemtype data[MAXSIZE]
int top1,top2;
}DStack;
DStack S;
2.构造一个空双向栈
int DStackinit()
{
S.top1=-1;
S.top2=MAXSIZE;
return 1;
}
3.入栈
int push(Dstack &S,Elemtype x,int i)
{
if(S.top2-S.top1==1)
{
cout<<"栈满";
return 0;
}
switch(i)
{
case 1:
S.data[++(S.top1)]=x;
break;
case 2:
S.data[--(S.top2)]=x;
break;
default:
cout<<"编号输入错误";
return 0;
}
return 1;
}
这里两栈共享向量空间,i是1或2表示两个栈,x是进栈元素。
4.出栈
int pop(Dstack &S,int i,Elemtype &x)
{
switch(i):
{
case 1:
if(S.top1==-1)
return 0;
else
x=S.data[S.top1--];
break;
case 2:
if(S.top2==MAXSIZE)
return 0;
else
x=S.data[S.top2++];
break;
default:
cout<<"编号输入错误";
return 0;
}
return 1;
}
这里两栈共享向量空间,i是1或2表示两个栈。
5.取栈顶元素
Elemtype DStackGetTop(DStack S,int i)
{
Elemtype x;
switch(i):
{
case 1:
x=S.data[S.top1];
break;
case 2:
x=S.data[S.top2];
break;
default:
cout<<"编号输入错误";
return 0;
}
return x;
}
这里两栈共享向量空间,i是1或2表示两个栈。
代码的很多注释是在学习过程中遇到的一些细节问题,给自己记录一下,也希望帮助大家更好地理解代码内容。
欢迎大家在评论区讨论!
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)