顺序栈与链式栈出栈、入栈的主函数

两者的区别:顺序栈不存在节点,就是一个大大的空间,里面的数据存储在一个数组中,因此可能会发生栈满的情况; 链式栈由一个一个的节点组成,入栈时临时开辟空间。

主函数

//顺序栈
int main (){

  Sqstack* s;

  int i,e;

  int a[MAX]={1,2,3};

  s=InitStack(s);

  s=pushstack(s,a);

​	e=popstack(s);

  return 0;

}


//链式栈
int main () {

​    linkstack *stack;

​    int e;

​    stack=initstack(stack);

​    stack=pushstack (1, stack);

​    stack=pushstack (2,stack);        //要有一个变量来接收函数的返回值

​    e=popstack(stack);            

​    return 0;

}

类型声明

typedef struct Sqstack{

​    int data[MAX];

​    int top;

}Sqstack                   //声明顺序栈的类型





typedef struct stacknode {

​    int data;

​    struct stacknode *next;

}linkstack;               //声明链式栈的类型

其中:top用作数组元素的移动;next用作节点的移动。

初始化栈

//初始化顺序栈
Sqstack * InitStack (Sqstack * s){

  s=(Sqstack*)malloc(sizeof(Sqstack));

  s->top=-1;

  return s;

}                              



//初始化链式栈

linkstack* initstack (linkstack *stack) {

​    stack = (linkstack *)malloc(sizeof(linkstack));

​    stack->next = NULL;

​    return stack;

}                               






初始化栈即为栈分配空间,并且将其初始化为空栈(类似i初始化为0)

入栈

//顺序栈入栈
Sqstack* pushstack (Sqstack *s,int a[MAX]){

  int i;

  for (i=0;i<MAX;i++){

​    s->top++;

​    s->data[s->top]=a[i];

  }

  return s;

}                                  




//链式栈入栈
linkstack* pushstack (int x, linkstack * stack) {

​    linkstack *p;

​    p = (linkstack*)malloc (sizeof(linkstack));

​    p->data = x;

​    p->next=stack;               //p->next表示p的next指向的结点

​    stack=p;

​    return stack;

}                              

出栈

//顺序栈出栈
int popstack (Sqstack *s){

​	int i;

​	for (i=0;i<MAX;i++){

​		printf ("%d ",s->data[s->top]);

​		s->top--;

​	}

​	return 0;

}



//链式栈出栈
int popstack (linkstack *stack) {

​    if (stack->next == NULL)

​    return 1;

​	int e;

​    linkstack *p;

​    do {

​        p = (linkstack*)malloc (sizeof(linkstack));

​        e = stack->data;

​        printf("%d ", e);

​        p = stack;

​        stack = stack->next; 

​		free (p);                        //要等到stack指向下一个值的时候再释放

​    }while(stack->next != NULL);         //当满足条件(...)时

​    return e;

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值