栈的表示和实现

Posted xiaoqiz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了栈的表示和实现相关的知识,希望对你有一定的参考价值。

栈是仅能在表尾(栈顶)进行插入或删除操作的  线性表 后进后出

基本操作: 初始化,判断是否为空栈,取栈顶元素,插入新的栈顶元素。

非空栈中栈顶指针始终在栈顶元素的下一个位置

 

技术图片

分为顺序栈:

#include<stdio.h>
#include<stdlib.h>
typedef struct{
   int *base;
   int *top;
   int stacksize;
}sqstack;

void  initial(sqstack &s){
   s.base=(int *)malloc(10*sizeof(int));
   if(s.base==0)  exit(0);
   s.top =s.base;
   s.stacksize=10;

}
void push(sqstack &s){
  int n,i=0;
  scanf("%d",&n);
  do{
    scanf("%d",s.top++);
    i++;
  }while(i<n);

}
void pop(sqstack &s,int &e){
    if(s.top==s.base)  exit(0);
    e=*--s.top;
}
main(){
   sqstack s;
   int e;
   initial(s);
   push(s);
   while(s.top-s.base>0){  //判断是否为空栈
   pop(s,e);
   printf("%d",e);}
}

链栈:

#include<stdio.h>
#include<stdlib.h>
typedef struct Lnode{
  int data;
  struct Lnode *next;
}Lnode, *Linkstack;          // 链栈的结点定义和单链表一样,只不过它只能在栈顶操作
void initial(Linkstack s){
  s=NULL;
}
void push(Linkstack &s, int e){
Linkstack p;
   p=(Linkstack)malloc(sizeof(Lnode));
   p->data = e;
   p->next =s;
   s=p;
}
void pop(Linkstack &s,int &e){
   Linkstack p;
    if(s->next==NULL)  exit(0);
     p=s;
    e=p->data;
    s=s->next;
    free(p);
}
main(){
  int e,n,i;
  Linkstack s;
  initial(s);
  scanf("%d",&n);
  while(n--){
  scanf("%d",&i);
  push(s,i);}
  while(s->next!=NULL){
    pop(s,e);
    printf("%d",e);
  }
  printf("\n");
}

     链栈最后运行是有一个bug

以上是关于栈的表示和实现的主要内容,如果未能解决你的问题,请参考以下文章

408数据结构与算法—链栈的表示和实现

408数据结构与算法—链栈的表示和实现

数据结构:C_顺序栈的实现

自定义栈的实现及使用两个栈模拟队列

nowcoder basic algorithm chapter 3

数据结构与算法学习笔记 栈和队列Ⅰ