顺序栈
1。栈的定义:只允许在一端进行删除或插入操作的线性表。
栈顶(Top):线性表中允许进行插入删除操作的那一端。
栈底(Bottom):不能进行插入删除的那一端。
顺序栈(顺序存储)
栈逻辑结构的实现
栈的链式存储结构(链栈)
顺序栈的实现
#define Maxsize 50
typedef struct{
Elemtype data[Maxsize]; //存放栈中元素
int top; //栈顶指针
}SqlStack;
注:栈顶指针的初值:s.top=-1;
进栈操作:先判断栈满不满;栈顶指针的值加一:s.top=s.top+1;再将数据送到栈顶元素。
出栈操作:先判断栈是否为空栈,若非空,则先将栈顶元素输出,再将栈顶指针减一:s.top-=1;
2.栈的各类基本操作:
栈的初始化:
void InitStack(SqlStack &S){
S.top=-1;
}
判栈空:
int EmpeyStack(SqlStack &S){
if(S.top==-1)
return false;
else
return true;
}
出栈:
void Push(SqlStack &S){
if(S.top==-1)
return false;
else{
printf(“%d”,S.data[S.top]);
S.top-=1;
}
}
读取栈顶元素:
Void GetTop(SqlStack &S){
if(S.top==-1)
return false;
printf(“%d”,S.data[S.top]);
return 1;
}
共享栈
1.定义:利用栈的低端不变的性质,可以让两个栈共享一个一维数组空间,将两个栈的栈底分别设置在共享空间的两端,与此同时,两个栈的栈顶向共享空间的中间移动。
2.两个栈的命名分别命名为0号栈和1号栈
两个栈的栈顶指针都指向栈顶元素:top0=-1表示0号栈为空;top1=Maxsize表示1号栈为空。
3.出栈与入栈
0号栈入栈:top0=top0+1 出栈top0=top0-1
1号栈入栈:top1=top1-1 出栈top1=top1+1
共享栈图示:
链栈(栈的链式结构)
链栈的数据结构定义:
typedef struct Linknode{
Elemtype data; //数据域
struct Linknode *next; //指针域
}*LinkStack; //栈的类型定义
编程练习题:
1.设单链表的表头指针为h,结点结构由data和next两个域构成,其中data域为字符型。试设计算法判断该链表的前n个字符是否中心对称。例如xyx、xyyx都是中心对称。
提示:可使用栈来判断链表中的数据是否中心对称。将链表的前一半元素依次进栈。在处理链表的后一半元素时,当访问到链表的一个元素后,就从栈中弹出一个元素,两个元素比较。
2.设有两个栈s1、s2都釆用顺序栈方式,并且共享一个存储区[0, …, maxsize-1],为了尽量利用空间,减少溢出的可能,可釆用栈顶相向、迎面增长的存储方式。试设计s1、s2 有关入栈和出栈的操作算法。
提示:这是共享栈的进出栈的基本操作:注意栈顶指针的移动与取数或赋值的先后顺序。