栈的数据结构及基本操作回顾

顺序栈

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 有关入栈和出栈的操作算法。

提示:这是共享栈的进出栈的基本操作:注意栈顶指针的移动与取数或赋值的先后顺序。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值