C语言顺序结构栈的初始化和出入栈

1.栈的概念

栈是一种限定操作进行方式的线性表,即只能在线性表的一端进行插入和删除操作。

如图1.1a的一端称作栈顶,b的一端称作栈底,栈的特点为先进后出。

添加元素:从栈顶a进入。当有新元素进入栈时,新元素就会在a的上面,如图1.2.

    a
 
    b

                                                                                                  图1.1

 新元素
   a
 
   b

                                                                                                   图1.2

删除元素:假设栈为如图1.3,当我删除元素时,只能先删除a,从栈顶出,故删除了一个元素后的栈变成了图1.4

     a
     b
     c

                                                                                                如图1.3

     b
     c

                                                                                                 图1.4

2.栈的顺序存储结构

C语言的存储结构描述

#define MAXSIZE 100     
typedef struct{
    DataType elem[MAXSIZE];
    int top;
}Stack;

 

1.初始化顺序栈

Stack InitStack{

Stack S;     //定义一个栈变量

S.top=-1;      //空栈的top值为-1,表示此时为一个空栈

return(S);     

}

分析:返回一个空的栈,空栈中元素个数为0,top值为-1。

2.进栈 

Stack  Push(Stack S,DataType x){

if(S.top==MAXSIZE-1){       //判断栈是否满

printf("栈已经满了,无法入栈");}

else

{

S.top=S.top+1;           //栈顶先上移一位,指向新的栈顶位置

S.elem[S.top]=x;      //把新元素x放到栈顶

}

return(S);

}

分析:顺序栈需要考虑容量问题。x进栈前要考虑栈是否满,栈没满时才可进栈。由于top指向栈顶元素位置,元素进栈前top应上移一位,指向新的栈顶位置,元素再放进top指向的位置,这样保证了操作结束后top含义不变

3.出栈

Stack top(Stack S){

if(S.top=-1){            //判断栈是否为空

printf("栈为空,无法出栈");

}

else{

S.top=S.top-1;         //栈顶下移一位即可表示删除元素

}

return(S)

}

分析 :上述算法中只是将top的指示位置下移了一位,实际上,在存储单元中,原来的栈顶还在,但TOP不指向它,它的存在并不重要,当有新的元素进入栈顶时,会把它覆盖掉。

4取栈顶元素

DataType GetTop(Stack S)

{

if(S.top==-1){     //判断栈是否为空

printf("栈为空,无法取出栈顶")

}

else{

x=S.elem[S.top];      //把栈顶的元素的值给了x

return(x);

}

分析:取栈顶有别于出栈,取栈顶只是把栈顶元素的值读出来,并不修改栈的内容,当栈不为空时,可以取栈顶,栈顶及top所指向的元素

 

上述算法时间复杂度都为O(1),进栈和出栈相当于在顺序表中进行插入和删除操作,只是此时操作对象是线性表的最后一个元素,无需移动大量元素,从本质上讲,栈的操作是对线性表操作的“简化”,顺序表允许的操作在栈里可能会不允许进行。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值