栈的基本操作(C语言)

顺序栈

-------------存储结构--------------

#define MAXSIZE 100 //顺序栈的存储空间的初始分配量

typedef struct{

SElemType *base; //栈底指针

SElemType *top; //栈顶指针

int stacksize;   //栈的最大可用容量

}SqStack;

1.初始化O(1)

{

SqStack* S.base =(SqStrack*)malloc(sizeof(MAXSIZE);

if(!S.base) return -1;//即当非S.base存在返回-1,为当S.base不存在时返回-1,

//即为分配内存地址失败。

S.top=S.base;//将base的位置付给top,即第一个进入栈的元素的位置在top处

S.stacksize=MAXSIZE;

return 1;

}

2.入栈 O(1)

//入栈时需要判断是否栈满

{

//设e为新入栈的元素;

if(S.top-S.base==S.stacksize) return -1; //栈满,无法做入栈操作;

*S.top++=e; //可分解为两步:*S.top=e; S.top++;运算符自左往右,

//即先做赋值操作,再做加一操作,入栈操作时每次入栈元素为新的栈顶,指针增1。

return 1;

}

3.出栈 O(1)

//出栈时需要判断是否栈空

{

if(S.top==S.base) return -1;  //栈空返回0;

e==*--top;  //分解为--S.top; e=*S.top; 先将指针下移,(原栈顶指针指向将入栈的位置,

//先指向第一个元素);再将此时元素赋值给e;

return 1;

}

4.取栈顶元素 O(1)

//取栈顶元素的前提是 有栈顶元素,故判断栈非空

{

if(S.top!=S.base)  return *(S.top-1);   //此时为取地址符所以可以直接-1;

}

也可为

{

if(S.top==S.base) return -1;

else return e=*(S.top-1);

}

综上,顺序栈与顺序表类似均会收到最大空间的限制,因此也会出现空间浪费和溢出的现象。

由此引入链栈。

链栈

------------链栈的存储结构-------------

typedef struct StackNode

{

ElemType   data;

struct StackNode *next:

}StackNode,*LinkStack;

1.初始化  o(1)

//链栈中无头节点,直接指向第一个元素

{

//因此初始化时,栈顶指针置空

LinkStack S=(LinkStack)malloc(sizeof(StackNode));

S=NULL;

return 1;
}

2.入栈 O(1)

{//新元素为e;

LinkStack p=(LinkStack)malloc(sizeof(StackNode));

p->data=e;

p->next=S;   //将新节点插入到栈顶位置;

S=p;    //将栈顶指针指向p;

return 1;

}

3.出栈 O(1)

//判断是否为空链栈

{

if(S==NULL) return -1;

e=S->data;  //将S的数据域赋值给e;

p=S;      //将S的地址赋值给p

S=S->next;   //顺位到下一元素地址;

free(n);

return 1;

}

4.取栈顶元素   O(1)

//判断是否为空

{

if(S!==NULL) return S->data;

}
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值