代碼如下:
#include<stdio.h> #include<stdlib.h> typedef struct { char *base; char *top; int stacksize; }sqStack; ////////////////////////////////////// //創建一個棧 #define STACK_SIZE 100 void initstack(sqStack *stack ) { stack->base = (char*)malloc( STACK_SIZE * sizeof(char)); if (!stack->base) { exit(0); } stack->top = stack->base; stack->stacksize = STACK_SIZE; } //////////////////////////////////// //入棧操作 #define STACK_MORE 10 void Push(sqStack *stack , char c) { if (stack->top - stack->base > stack->stacksize) { stack->base = (char*)realloc(stack->base , (stack->stacksize + STACK_MORE) * sizeof(char)); if (!stack->base) { exit(0); } stack->top = stack->base + stack->stacksize; stack->stacksize = stack->stacksize + STACK_MORE; } *(stack->top) = c; stack->top++; } ////////////////////////////////////// //出棧操作 void Pop(sqStack *stack , char *c) { if (stack->base == stack->top) { return; } *c = *--(stack->top); } /////////////////////////////////////// //清空棧 void ClearStack(sqStack *stack) { stack->top = stack->base; } ////////////////////////////////////// //銷毀一個棧 void destoryStack(sqStack *stack) { for (size_t i = 0; i < stack->stacksize; i++) { free(stack->base); stack->base++; } stack->base=stack->top = NULL; stack->stacksize = 0; } int main() { sqStack stack; char c=1; printf("請安任意鍵創建一個棧...\n"); getchar(); initstack(&stack); printf("創建成功!\n"); printf("請輸入要壓入棧的一個字符串(讀取到0截至): "); while ((c = getchar()) != '\n') { //scanf("%c",&c); //fflush(stdin); if (c!='\n') { Push(&stack , c); } } printf("壓入字符完成,正在打印字符串...\n"); for (size_t i = 0; i < (stack.top - stack.base); i++) { printf("%c",*(stack.base + i)); } putchar('\n'); printf("請輸入要彈出幾個字符:"); int k; scanf("%d",&k); while (k) { k--; Pop(&stack , &c); printf("字符%c已彈出!\n",c); } printf("彈出字符完成,正在打印字符串...\n"); for (size_t i = 0; i < (stack.top - stack.base); i++) { printf("%c",*(stack.base + i)); } putchar('\n'); printf("接下來你可以選擇清空(輸入1)或者銷毀(輸入2)這個棧:"); scanf("%d",&k); fflush(stdin); switch (k) { case 1: ClearStack(&stack); if (stack.top == stack.base) { printf("清空完成!"); } break; case 2: destoryStack(&stack); if(stack.base == NULL && stack.top == NULL && stack.stacksize == 0) { printf("已成功銷毀!"); } break; default: break; } return 0; }
運行結果: