数据结构上机——栈

来源:互联网 发布:Win10网络图标显示红叉 编辑:程序博客网 时间:2024/06/08 06:01
#include<stdio.h>   #include<stdlib.h> #define ERROR -1#define OK 1typedef  char SElemType;typedef   int Status;typedef   struct LNode{    SElemType data;     struct  LNode  *next;} *SLink;typedef   struct{    SLink top;    //栈顶指针     int  length;   //栈中元素个数}LStack;LNode *p;LNode *q;LStack S;void InitStack(LStack &S){    S.top=NULL;    S.length = 0;}int gettop(LStack S,char &e){//取栈顶     if(S.length==0) return ERROR;    e=(S.top->next->data);    return OK;}void push(LStack &S,char e){//进栈     p=(LNode*)malloc(sizeof(LNode));    if(!p) exit(1);    p->data=e;    p->next=S.top;    S.top=p;    ++S.length;}bool Pop(LStack &S,char &e){//出栈     if(!S.top) return false;    else{        e=S.top->data;        S.top=S.top->next;        --S.length;         return true;    }} int main(){    InitStack(S);    char e='a';    for(int i=0;i<5;i++){        push(S,e);//字符进栈         e++;    }    if(gettop(S,e)==1) printf("%c ",e);    puts("");    while(Pop(S,e)){        printf("%c ",e);    }    return 0;}
#include<stdio.h>   #include<stdlib.h> typedef  char SElemType;typedef   int Status;#define STACK_INIT_SIZE  100//栈存储空间的初始分配量#define  STACKINCREMENT   10//  栈存储空间的分配增量int OK=1,OVERFLOW=-1,ERROR=-1;typedef struct{    SElemType *base;//栈空间基址称为栈底指针,指向栈底位    SElemType *top; //栈顶指针,约定栈顶指针指向栈顶元素的 下(后面)一个位置                             int stacksize;     //当前分配的栈空间大小(以sizeof(SElemType)为单位)}SqStack;// SqStack::结构类型名Status InitStack_Sq(SqStack &S)  {    S.base=(SElemType * )malloc((STACK_INIT_SIZE)*sizeof(SElemType));    if (! S. base) exit(OVERFLOW);    //存储分配失败    S.top=S.base;          S.stacksize=STACK_INIT_SIZE;          return OK;               }Status GetTop(SqStack S, SElemType &e) {           // 若栈不空,则用e返回S的栈顶元素,并返回OK;    //否则返回ERROR        if (S.top==S.base)  return ERROR;        //若栈为空             e = * (S.top-1);              return OK;}//GetTop_SqStatus Push(SqStack &S, SElemType e) {      //将元素e插入栈成为新的栈顶元素,要考虑上溢情况       if (S.top-S.base>=S.stacksize) {        //栈满,追加存储空间                         S.base= (SElemType*)realloc(S.base,(S.stacksize +STACKINCREMENT)*sizeof(SElemType));            if (! S. base) exit(OVERFLOW);  //存储分配失败                    S.top=S.base+S.stacksize;                    S.stacksize+=STACKINCREMENT;        }      *S.top++=e;     //元素e 插入栈顶,修改栈顶指针           return OK;     }//PushStatus Pop(SqStack &S, SElemType &e) {  //若栈不空,则删除S的栈顶元素,用e 返回其值并返回OK     //否则返回ERROR          if (S.top== S.base) return ERROR;      //栈空,返回ERROR          e = * --S.top;              //删除栈顶元素,用e 返回其值,并修改栈顶指针    return OK;} //Popint main(){    SqStack S;    char c;    printf("%d ",InitStack_Sq(S));    puts("");    char e='a';    for(int i=0;i<5;i++){        Push(S,e);//字符进栈         e++;    }    if(GetTop(S,e)==1) printf("%c ",e);    puts("");    while(Pop(S,e)==1){        printf("%c ",e);    }    return 0;}
#include<stdio.h>   #include<stdlib.h> #define ERROR -1#define OK 1typedef  char SElemType;typedef   int Status;typedef   struct LNode{    SElemType data;     struct  LNode  *next;} *SLink;typedef   struct{    SLink top;    //栈顶指针     int  length;   //栈中元素个数}LStack;LNode *p;LNode *q;LStack S,R;char e;void InitStack(LStack &S){    S.top=NULL;    S.length = 0;}int gettop(LStack S,char &e){//取栈顶     if(S.length==0) return ERROR;    e=(S.top->next->data);    return OK;}void push(LStack &S,char e){//进栈     p=(LNode*)malloc(sizeof(LNode));    if(!p) exit(1);    p->data=e;    p->next=S.top;    S.top=p;    ++S.length;}bool Pop(LStack &S,char &e){//出栈     if(!S.top) return false;    else{        e=S.top->data;        S.top=S.top->next;        --S.length;         return true;    }} void Enqueue(LStack &S){    e='a';    for(int i=0;i<5;i++){        push(S,e);//模拟入队列         printf("%c ",e);        e++;    }}void dequeue(LStack &S,LStack &R){    if(R.top) {        Pop(R,e);//栈R不为空,直接出队列     }    else{               while(S.length!=0){            Pop(S,e);            push(R,e);//栈S元素全部进R         }        Pop(R,e);    }    printf("%c ",e);}int main(){    InitStack(S);    InitStack(R);    puts("依次进队5个:");    Enqueue(S);    puts("");    puts("出队一个:") ;     dequeue(S,R);     puts("") ;    puts("再出队一个哈哈:") ;     dequeue(S,R);     return 0;}
原创粉丝点击