c++順序棧和鏈式棧的實現
阿新 • • 發佈:2019-02-05
基本定義:
棧(Stack)是n個元素a1,a2,…an,組成的有限序列,記作S =(a1,a2,…,an),並且只能在一端插入和刪除元素,n=0時稱為空棧。
棧的特徵:
由於棧只能從一端插入和刪除元素,故棧具有後進先出(Last in,first out,LIFO)的特性。稱插入和刪除的一端為棧頂(top),另一端為棧底(bottom)。稱插入元素為入棧或壓棧(push),刪除元素為出棧或彈棧(pop)。
棧的基本運算定義:
棧初始化:Init_Stack() 初始條件:棧不存在 操作結果:構造了一個空棧 判斷空: Empty_Stack() 若棧空,則返回為1,否則返回0
入棧: Push_Stack(S,x) 初始條件:棧S已經存在 操作結果:在棧S的頂部插入一個元素x,這樣x就、成為新的棧頂元素。
出棧: Pop_Stack(S,&x) 初始條件:棧S存在且不為空 操作結果:棧S的頂部元素從棧頂刪除,儲存在變數x中
取棧頂元素: GetTop_Stack(S) 初始條件:棧s存在且不為空 操作結果:返回棧S的棧頂元素,且原棧的結構不會變化
銷燬棧: Destory_Stack(S) 初始條件:棧S已經存在 操作結果: 銷燬一個已經存在的棧
棧的儲存方式: (1)順序儲存 (2)鏈式儲存
下面分別實現這兩種棧的儲存方式:
棧(Stack)是n個元素a1,a2,…an,組成的有限序列,記作S =(a1,a2,…,an),並且只能在一端插入和刪除元素,n=0時稱為空棧。
棧的特徵:
由於棧只能從一端插入和刪除元素,故棧具有後進先出(Last in,first out,LIFO)的特性。稱插入和刪除的一端為棧頂(top),另一端為棧底(bottom)。稱插入元素為入棧或壓棧(push),刪除元素為出棧或彈棧(pop)。
棧的基本運算定義:
棧初始化:Init_Stack() 初始條件:棧不存在 操作結果:構造了一個空棧 判斷空: Empty_Stack() 若棧空,則返回為1,否則返回0
入棧: Push_Stack(S,x) 初始條件:棧S已經存在 操作結果:在棧S的頂部插入一個元素x,這樣x就、成為新的棧頂元素。
出棧: Pop_Stack(S,&x) 初始條件:棧S存在且不為空 操作結果:棧S的頂部元素從棧頂刪除,儲存在變數x中
取棧頂元素: GetTop_Stack(S) 初始條件:棧s存在且不為空 操作結果:返回棧S的棧頂元素,且原棧的結構不會變化
銷燬棧: Destory_Stack(S) 初始條件:棧S已經存在 操作結果: 銷燬一個已經存在的棧
棧的儲存方式:
下面分別實現這兩種棧的儲存方式:
1、鏈式儲存
// 棧.cpp : 定義控制檯應用程式的入口點。 //實現棧的建立,增、刪、查、改 #include "stdafx.h" #include<iostream> #include<ctype.h> using namespace std; typedef struct node { int data; struct node *next; }Dnode; //初始化棧 void InitStack(Dnode *&S) { Dnode *top; top = (Dnode*)malloc(sizeof(Dnode)); if (top == NULL) { cout << "記憶體分配失敗!" << endl; exit(0); } top->next = NULL; S = top; } //向棧中新增資料,輸入非數字結束 void InitData(Dnode *S) { Dnode *top=S,*p; int e; int i = 1; cout << "請輸入第"<<i++<<"個數據:" ; cin >> e; cout << endl; while (e!=-1) { p = (Dnode*)malloc(sizeof(Dnode)); if (p == NULL) { cout << "記憶體分配失敗!" << endl; exit(0); } p->data = e; p->next = top->next; top->next = p; cout << "請輸入第" << i++ << "個數據:"; cin >> e; cout << endl; } } //壓棧 void PushToStack(Dnode *S) { Dnode *top=S,*p; int e; cout << "請輸入壓棧資料:"; cin >> e; cout << endl; p = (Dnode*)malloc(sizeof(Dnode)); if (p == NULL) { cout << "記憶體分配失敗!" << endl; exit(0); } else { p->data = e; p->next = top->next; top->next = p; } } //出棧,並釋放分配的記憶體 void PopStack(Dnode *S, int &e) { Dnode *top = S->next; if (top!=NULL) { Dnode *delete_ptr=top; e=top->data; S->next = top->next; free(delete_ptr); } } //銷燬棧,釋放所有分配的記憶體 void destoryStack(Dnode *S) { Dnode *delete_ptr; while (S->next!=NULL) { delete_ptr = S->next; S ->next= S->next->next; free(delete_ptr); } //free(S); } //判斷棧是否為空 bool isEmpty(Dnode *S) { Dnode *top=S; if (top->next != NULL) { return false; } else { return true; } } //遍歷棧 void PrintStack(Dnode *S) { Dnode *top = S->next; while (top != NULL) { cout << top->data << " "; top = top->next; } cout << endl; } void main() { Dnode *S = NULL; int i; while (true) { cout << endl; cout << " ***********************************************************" << endl; cout << " * *" << endl; cout << " * 1、初始化棧 *" << endl; cout << " * 2、向棧中新增多個值,以非數字結束 *" << endl; cout << " * 3、遍歷棧 *" << endl; cout << " * 4、判斷棧是否為空 *" << endl; cout << " * 5、壓棧 *" << endl; cout << " * 6、出棧 *" << endl; cout << " * 7、銷燬棧 *" << endl; cout << " * *" << endl; cout << " ***********************************************************" << endl; cout << "請輸入選單序號,執行相應操作:"; cin >> i; cout << endl; if (S == NULL&&i != 1) { cout << "棧尚初始化,請先建立棧,再進行其他初始化操作" << endl; i = 1; } switch (i) { case 1://初始化棧 InitStack(S); cout << "初始化完成"<<endl; break; case 2://初始化棧中資料 InitData(S); PrintStack(S); break; case 3://遍歷棧 PrintStack(S); break; case 5://壓棧 PushToStack(S); PrintStack(S); break; case 6://出棧 int e; PopStack(S, e); cout << "出棧元素為" <<e<< endl; cout << "出棧後的棧中資料:"; PrintStack(S); break; case 7://銷燬棧 destoryStack(S); cout << "棧已銷燬!"; break; case 4://判斷棧是否為空 bool flag = isEmpty(S); if (flag) { cout << "棧為空!" << endl; } else { cout << "棧不為空!" << endl; } break; } } system("pause"); }
2順序棧的實現
#include "stdafx.h" #include <iostream> #define STACK_INIT_SIZE 5 #define STACK_INCREMENT 3 using namespace std; typedef struct stack { int *top;//棧頂指標 int *base;//棧底指標 int size;//棧當前容量 }sqStack; //初始化棧 void InitStack(sqStack *&S) { //構造一個空棧 S = (sqStack*)malloc(sizeof(sqStack)); S->base = S->top = NULL; S->size = 0; S->base = (int *)malloc(sizeof(int)*STACK_INIT_SIZE); if (!S->base) { cout << "記憶體分配失敗!"<<endl; exit(OVERFLOW); } else { S->top = S->base; S->size = STACK_INIT_SIZE; cout << "構造空棧完成!" << endl; } } //判斷棧是否為空 bool isEmptyStack(sqStack *S) { if (S->base == S->top) { return true; } else { return false; } } //遍歷棧 void PrintStack(sqStack *S) { if (!isEmptyStack(S)) { int *p,*top=S->top; p = S->top; cout << "遍歷結果為:"; while (S->top != S->base) { cout << *(--p) << " "; S->top = p; } S->top = top; } else { cout << "棧為空!" << endl; } } //壓棧 void pushStack(sqStack *S){ if (S->top - S->base >= S->size) { S->base = (int *)realloc(S->base,sizeof(int)*(S->size + STACK_INCREMENT)); if (!S->base) { exit(OVERFLOW); } } int *p=S->top; int e; cout << "請輸入壓棧元素:" ; cin >> e; *p++ = e; S->top = p; } //出棧 bool popStack(sqStack *S, int &e) { int *p = S->top; if (p != S->base) { e = *--p; S->top = p; return true; } else { cout << "棧為空!"<<endl; return false; } } void main() { sqStack *S=NULL; int i; while (true) { cout << endl; cout << " ***********************************************************" << endl; cout << " * *" << endl; cout << " * 1、初始化棧 *" << endl; cout << " * 2、遍歷棧 *" << endl; cout << " * 3、判斷棧是否為空 *" << endl; cout << " * 4、壓棧 *" << endl; cout << " * 5、出棧 *" << endl; cout << " * *" << endl; cout << " ***********************************************************" << endl; cout << "請輸入選單序號,執行相應操作:"; cin >> i; if (S == NULL&&i != 1) { cout << "請先初始化棧,再進行其它操作:" << endl; i = 1; } else { cout << endl; } switch (i) { case 1://初始化棧 InitStack(S); break; case 2://遍歷棧 PrintStack(S); break; case 3://判斷棧是否為空 if (isEmptyStack(S)) { cout << "棧為空!" << endl; } break; case 4://壓棧 pushStack(S); PrintStack(S); break; case 5://出棧 int e; if (popStack(S, e)) { cout << "出棧元素為:" << e << endl; } cout << "出棧後為:"; PrintStack(S); cout << endl; break; default: cout << "請輸入正確的選單序號!"<<endl; break; } } system("pause"); }