C語言 實現 連結串列棧
阿新 • • 發佈:2019-01-01
LinkStack.h 標頭檔案宣告如下:
#include <stdio.h> typedef int DataType; //自定義資料型別,假定為整型 struct Node; //單鏈表結點型別 typedef struct Node *PNode; //結點指標型別 typedef struct Node //單鏈表結點結構 { DataType info; //結點資料域 PNode link; //結點指標域 }Node; typedef struct LinkStack //連結串列棧定義 { PNode top; //棧頂指標 }LinkStack; typedef struct LinkStack * PLinkStack; //連結串列棧的指標型別 //建立一個空棧 PLinkStack createEmptyStack( void ); //判斷棧是否為空棧 int isEmptyStack(PLinkStack stack); //進棧,成功返回1,失敗返回0 int push(PLinkStack stack,DataType x); //出棧,成功返回1,失敗返回0 int pop(PLinkStack stack); //取棧頂元素 DataType getTop(PLinkStack stack); //顯示棧內所有元素 void showStack(PLinkStack stack); //把棧置空 void setEmpty(PLinkStack stack); //把棧銷燬 void destroyStack(PLinkStack stack);
LinkStack.cpp 使用連結串列實現棧的基本操作,程式碼如下:
#include <stdio.h> #include <malloc.h> #include "LinkStack.h" //建立一個的空棧 PLinkStack createEmptyStack(void) { PLinkStack stack=(PLinkStack)malloc(sizeof(struct LinkStack)); if(stack == NULL) printf("儲存分配失敗,請重建棧!\n"); else stack->top=NULL; return stack; } //判斷棧是否為空棧 int isEmptyStack(PLinkStack stack) { return (stack->top == NULL); } //進棧,成功返回1,失敗返回0 int push(PLinkStack stack,DataType x) { PNode p =(PNode)malloc(sizeof(struct Node)); if(p == NULL ) { printf("新結點分配記憶體失敗,進棧失敗,請重試!\n"); return 0; } else { p->info = x; p->link=stack->top; //替換棧頂元素 stack->top=p; return 1; } } //出棧,成功返回1,失敗返回0 int pop(PLinkStack stack) { if(isEmptyStack(stack)) { printf("棧為空!\n"); return 0; } else { PNode p; p=stack->top; //刪除最後一個結點 stack->top = stack->top->link; free(p); return 1; } } //取棧頂元素 DataType getTop(PLinkStack stack) { if(isEmptyStack(stack)) { printf("棧為空!取棧頂元素失敗!\n"); return NULL; } return (stack->top->info); } //顯示棧內所有元素 void showStack(PLinkStack stack) { if(isEmptyStack(stack)) printf("當前棧為空!無內容可顯示。\n"); else { PNode p; p=stack->top; printf("頂--> "); while(p->link != NULL) { printf("%d ",p->info); p=p->link; } printf("%d ",p->info); //顯示最後一個元素 printf("-->底\n"); } } //把棧置空 void setEmpty(PLinkStack stack) { stack->top=NULL; } //把棧銷燬 void destroyStack(PLinkStack stack) { if(stack) { stack->top=NULL; free(stack); } }
main.cpp 檔案實現main函式對鏈棧進行呼叫操作:
#define _CRT_SECURE_NO_DEPRECATE //解決在VS環境裡出現的警告問題 #include <stdio.h> #include "LinkStack.h" int main( ) { char input; DataType data; PLinkStack stack; do { printf("---------------------------------------------\n"); printf("---------------------------------------------\n"); printf("---- 輸入對應字元執行以下操作 ----\n"); printf("---- ----\n"); printf("---- \"0\":建立一個空棧 ----\n"); printf("---- \"1\":檢查棧是否為空 ----\n"); printf("---- \"3\":執行入棧操作 ----\n"); printf("---- \"4\":執行出棧操作 ----\n"); printf("---- \"5\":列印棧頂元素 ----\n"); printf("---- \"6\":列印棧內所有元素 ----\n"); printf("---- \"7\":把棧清空 ----\n"); printf("---- \"8\":把棧銷燬 ----\n"); printf("---- \"q\":退出程式 ----\n"); printf("---------------------------------------------\n"); printf("---------------------------------------------\n"); printf("選擇操作:"); scanf("%c",&input); switch(input) { case '0': stack=createEmptyStack(); printf("成功建立連結串列棧。\n"); break; case '1': if(isEmptyStack(stack)) printf("該棧當前為空棧!\n"); else printf("該棧當前不為空棧!\n"); break; case '3': fflush(stdin); printf("請輸入要入棧的值:"); scanf("%d",&data); if( push(stack,data)) { printf("入棧成功,棧當前內容:"); showStack(stack); } else { printf("入棧失敗,請檢查!\n"); } break; case '4': if( pop(stack)) { printf("出棧成功,棧當前內容:"); showStack(stack); } else { printf("出棧失敗,請檢查!\n"); } break; case '5': data=getTop(stack); printf("棧頂值為:%d\n",data); break; case '6': printf("棧當前內容:"); showStack(stack); break; case '7': setEmpty(stack); printf("棧當前內容:"); showStack(stack); break; case '8': destroyStack(stack); printf("成功將棧銷燬!\n"); break; default: break; } printf("\n"); fflush(stdin); /*清空緩衝區,也可以使用rewind(stdin);*/ }while( input != 'q' ); return 0; }