資料結構實驗三——順序棧
阿新 • • 發佈:2019-01-27
這個我自己測試了一下。感覺沒什麼問題。其實也不知道到底有沒有問題!發現問題,希望大家能指出!#include <stdio.h> #include <stdlib.h> #define M 10 #define N 5 int flag=0; typedef struct SeqStack { char *top; char *base; int stacksize; }SeqStack; void InitStack(SeqStack *S) { S->base=(char *)malloc(M*sizeof(char)); S->top=S->base; S->stacksize=M; } void CreateStack(SeqStack *S) { if(flag==1) printf("順序棧已經建立!\n"); else { int i,length; char ch; printf("請輸入要建立順序棧的長度:\n"); scanf("%d",&length); for(i=0;i<length;i++) { printf("請輸入順序棧的元素:\n"); scanf("%c",&ch); if((ch=getchar())!='\n') *S->top++=ch; } flag=1; printf("順序棧建立完成!\n"); } } void PushStack(SeqStack *S) { if(flag==0) printf("順序棧未建立,無法進行入棧操作!\n"); else { char e; printf("請輸入入棧的元素!\n"); e=getchar(); scanf("%c",&e); if(S->stacksize<=S->top-S->base) { S->base=(char *)realloc(S->base,(S->stacksize+N)*sizeof(char)); S->top=S->base+S->stacksize; S->stacksize+=N; } *S->top++=e; printf("入棧操作成功!\n"); } } void PopStack(SeqStack *S) { if(flag==0) printf("順序棧未建立,無法進行出棧操作!\n"); else { if(S->base==S->top) printf("順序棧為空,無法進行出棧操作!\n"); else { char ch; ch=*--S->top; printf("順序棧出棧成功,出棧元素為%c\n",ch); } } } void StackLength(SeqStack S) { int len; if(flag==0) printf("順序棧未建立,無法計算棧長度!\n"); else { len=S.top-S.base; printf("順序棧的長度為:%d\n",len); } } int StackEmpty(SeqStack S) { if(flag==0) printf("順序棧未建立,無法判斷是否為空!\n"); else { if(S.base==S.top) { printf("順序棧為空!\n"); return 1; } else printf("順序棧不為空!\n"); } return 0; } void DisplayStack(SeqStack S) { if(flag==0) printf("順序棧未建立,無法顯示!\n"); else { char *r,*p=--S.top; char *q=S.base; printf("順序棧的顯示順序為:\n"); for(r=p;r>=q;r--) printf("%c ",*r); printf("\n"); } } void DestoryStack(SeqStack *S) { if(flag==0) printf("順序棧未建立,不需要銷燬!\n"); else { free(S->base); flag=0; printf("順序棧已成功被銷燬!\n"); } } void menu() { printf("\t順序棧基本實驗操作\n"); printf("*********************************\n"); printf("1 建立順序棧!\t\t\t*\n"); printf("2 順序棧入棧操作!\t\t*\n"); printf("3 順序棧出棧操作!\t\t*\n"); printf("4 求順序棧長度!\t\t*\n"); printf("5 判斷順序棧是否為空!\t\t*\n"); printf("6 顯示順序棧!\t\t\t*\n"); printf("7 銷燬順序棧!\t\t\t*\n"); printf("0 退出程式!\t\t\t*\n"); printf("*********************************\n"); } int main() { int select; SeqStack ptr; InitStack(&ptr); while(1) { menu(); printf("請輸入選擇命令:\n"); scanf("%d",&select); switch(select) { case 1: CreateStack(&ptr); break; case 2: PushStack(&ptr); break; case 3: PopStack(&ptr); break; case 4: StackLength(ptr); break; case 5: StackEmpty(ptr); break; case 6: DisplayStack(ptr); break; case 7: DestoryStack(&ptr); break; case 0: exit(1); break; default : printf("命令輸入有誤,請重新輸入!\n"); break; } } return 0; }