栈的顺序存储与链式存储

顺序:

#include<iostream>    
#include<cstdio>    
#include<malloc.h>    
    
#define STACK_INIT_SIZE 100    
#define STACKINCREMENT 10    
#define OVERFLOW -2    
#define ERROR 0    
typedef struct{    
    int *base;    
    int *top;    
    int stacksize;    
}Sqstack;    
    
void InitStack(Sqstack &S){    
    S.base=(int *)malloc(STACK_INIT_SIZE*sizeof(int));    
    if(!S.base)exit(OVERFLOW);    
    S.top=S.base;    
    S.stacksize=STACK_INIT_SIZE;    
}    
    
void Push(Sqstack &S,int e){    
    if(S.top-S.base>=S.stacksize){//栈满,追加空间    
        S.base=(int *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(int));    
        if(!S.base)exit(OVERFLOW);   
        S.top=S.base+S.stacksize; 
        S.STACK_INIT_SIZE+=STACKINCREMENT;   
    }      
    *S.top++=e;    
}    
    
int GetLength(Sqstack S){    
    int len=0;    
    int *p=S.top;//这里不能再用S.top了,不然就把栈给清空了    
    while(p!=S.base){    
        len++;    
        p--;    
    }    
    printf("长度为%d\n",len);    
    return len;    
}    
    
void Traverse(Sqstack S){    
    int n=GetLength(S);    
    printf("从栈底到栈顶元素依次是:\n");    
    for(int i=0;i<n;i++){    
        printf("%d ",S.base[i]);    
    }    
    printf("\n");    
}    
    
void Pop(Sqstack &S,int &e){    
    if(S.top==S.base)exit(0);    
    e=*--S.top;    
}    
int main(){    
    Sqstack L;    
    InitStack(L);    
    int n=5;    
    while(n--){    
        Push(L,n);    
    }    
    
    Traverse(L);    
    Pop(L,n);    
    printf("弹出元素为%d\n",n);    
    Traverse(L);    
}     


链式:

#include<iostream>  
#include<cstdio>  
#include<malloc.h>  
  
#define OVERFLOW -2  
  
typedef struct node{  
    int data;  
    struct node *next;  
}LStack,*LinkStack;  
  
  
void InitStack(LinkStack &S){  
    S=(LinkStack)malloc(sizeof(LStack));  
    if(!S)exit(OVERFLOW);  
    S->next=NULL;  
}  
int GetLength(LinkStack &S){  
    int i=0;  
    LStack *p=S->next;  
    while(p){  
        p=p->next;  
        i++;   
    }  
    printf("结点数为:%d\n",i);  
    return i;  
}  
  
  
void Push(LinkStack &S,int e){  
    LStack *p;  
    p=(LinkStack)malloc(sizeof(LStack));  
    if(!p)exit(OVERFLOW);  
    p->data=e;  
    p->next=S->next;  
    S->next=p;  
}  
  
  
void Pop(LinkStack &S){  
    if(!S->next)return;
    LStack *p;  
    p=S->next;  
    printf("弹出的值为:%d\n",p->data);  
    S->next=p->next;  
    free(p);  
}  
void Traverse(LinkStack &S){  
    LStack *p;  
    p=S->next;  
    printf("栈顶->栈底依次是:\n");  
    while(p){  
        printf("%d ",p->data);  
        p=p->next;  
    }  
    printf("\n");  
}  
int main(){  
    LinkStack T;  
    InitStack(T);  
    int n=5;  
    while(n--){  
        Push(T,n);  
    }  
    GetLength(T);  
    Traverse(T);  
    Pop(T);  
    Traverse(T);  
}  


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值