顺序栈&链栈

定义

栈是限制在一端进行插入操作和删除操作的线性表,俗称堆栈,允许进行操作的一端称为“栈顶”,另一固定端称为“栈底”,当栈中没有元素时称为“空栈”。
后进先出
栈有顺序栈链栈两种存储结构,这两种存储结构的不同,则使得实现栈的基本运算的算法也有所不同。

顺序栈

顺序栈它是线性逻辑结构顺序存储的一种,具有和顺序表同样的存储结构,由数组定义,配合用数组下标表示的栈顶指针top完成各种上操作。

定义

typedef int datatype;
#define maxsize 64
typedef struct{
    datatype data[maxsize];
    int top;
}seqStack,*seqStackP;

初始化

void SetEmpty(seqStack *s){
     s->top = -1;
} 

Empty

bool Empty(seqStack *s){
    return ((s->top >=0)?false:true);
}

进栈

seqStackP Push(seqStackP s,int x){
    if (s->top==maxsize-1){
       printf("over\n");
       return NULL;
    }else{
      s->top++;
      s->data[s->top]=x;
    }
    return s;
}

出栈

datatype Pop(seqStackP s){
  if (Empty(s)){
     printf("null\n");
     return NULL;
  }else{
     return s->data[s->top--];
  }
} 

取栈顶

datatype Top(seqStackP s){
  if (Empty(s)){
     printf("null\n");
     return NULL;
  }else{
     return s->data[s->top];
  }
} 

建立

void CreateStack(seqStackP s){
    SetEmpty(s);
    int d;
    scanf("%d",&d);
    while (s->top<maxsize&&d!=-1){
        Push(s,d);
        scanf("%d",&d);
    }
}

链 栈

定义

typedef int datatype;
typedef struct node{
     datatype data;
     struct node *nex;
}linksatck;

空栈和初始化

void SetEmpty(linkstack* s) {
    s->next = NULL;//在此是设立一个head结点,栈顶在head->next位置
}
bool isEmpty(linkstack* s) {
    return s->next==NULL?true:false;
}

进栈

void push(linkstack *top,datatype x) {
    linkstack * p = (linkstack*)malloc(sizeof(linkstack));
    p->data = x;
    p->next = top->next;
    top->next = p;
    return ;
}

出栈

linkstack* pop(linkstack * top,datatype* x) {
    if(isEmpty(top)) {
        printf("wrong!\n");
        return NULL;
    } else {
        linkstack *p = top->next;
        *x = p->data;
        top->next = p->next;
        free(p);
        return top;
    }
}

创建栈

void create(linkstack *s) {
    int x;
    scanf("%d",&x);
    while (x!=-1) {
        push(s,x);
        scanf("%d",&x);
    }
    return ;
}

…简单操作,仅作复习使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值