棧:限定僅在表尾進行插入或刪除操作的線性表,對棧來說,表尾端為棧頂,表頭端為棧底。
本文實現了順序棧的表示和相關函數操作,以及一些驗證性代碼。
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define OK 1
#define TRUE 1
#define FALSE 0
#define ERROR 0typedef int Status;
typedef int SElemType;typedef struct{SElemType *base;SElemType *top;int stacksize;
}SqStack;Status Init_Stack(SqStack &S){S.base=(SElemType*)malloc(sizeof(SElemType)*STACK_INIT_SIZE);if(!S.base){printf("Merry Error\n");exit(0);}S.top=S.base;S.stacksize=STACK_INIT_SIZE;return OK;
}Status Clear_Stack(SqStack &S){S.top=S.base;return OK;
}Status Stack_Empty(SqStack S){if(S.top==S.base){return TRUE;}else{return FALSE;}
}int Stack_Length(SqStack S){int length=0;while(S.base!=S.top){S.top--;length++;}return length;
} Status Get_Top(SqStack S,SElemType &e){if(S.base==S.top){return ERROR;}else{e=*(S.top-1);return OK;}
}Status Push(SqStack &S,SElemType e){if(S.top-S.base>=S.stacksize){S.base=(SElemType *)realloc(S.base,sizeof(SElemType)*(S.stacksize+STACKINCREMENT));if(!S.base){printf("Merroy Error!\n");exit(0);}}S.stacksize+=STACKINCREMENT;*S.top++=e;return OK;
}Status Pop(SqStack &S,SElemType &e){if(S.base==S.top){return ERROR;}e=*(--S.top);return OK;
}Status Destroy_Stack(SqStack &S){S.top=S.base;free(S.base);return OK;
}int main(){SqStack S;int e;int choice;if(Init_Stack(S)){printf("Init Stack OK!\n");}while(1){printf("選擇要進行的操作:\n");printf("1、壓棧 2、出棧\n");printf("3、取棧頂 4、棧長度\n");printf("5、清空棧 6、銷毀棧\n");scanf("%d",&choice);switch(choice){case 1:printf("要壓棧的數據:");scanf("%d",&e);Push(S,e);break;case 2:if(Pop(S,e)){printf("出棧的數據為:%d\n",e);}else{printf("空棧,出棧失敗!\n");}break;case 3:if(Get_Top(S,e)){printf("棧頂元素為:%d\n",e);}else{printf("空棧,出棧失敗!\n");}break;case 4:printf("棧長度為:%d\n",Stack_Length(S));break;case 5:Clear_Stack(S);break;case 6:Destroy_Stack(S);printf("棧已銷毀!退出程序中\n");Sleep(1000); exit(0);default:break;}}return 0;
}
歡迎留言交流