stack (C++中STL庫常用stack基本用法的實現) ([連結串列],[陣列]的實現)
阿新 • • 發佈:2019-02-04
Stack:依循先進後出原則的單調佇列.
下面是用連結串列實現的stack的幾個基本用法和一個clear()的補充用法:
#include<stdio.h> /* *Date:2018/10/22 *Author:Fushicho *Name:stack連結串列版 *Function:push(),pop(),top(),emtpy(),size(),clear() */ struct node { int num; //節點元素 node *pre_p; //節點指標指向該節點的前一個節點 node() { //建構函式(初始化) this->pre_p = NULL; } }; struct stack { private: node *Top; //棧頂指標 public: stack() { //建構函式(初始化) Top = NULL; } void push(int x) { //向棧頂放入一個元素 node *p = new node(); p->num = x; if (emtpy()) { //棧為空 Top = p; } else { //棧不為空 p->pre_p = Top; Top = p; } } void pop() { //將棧頂節點彈出並釋放記憶體 node *p = Top; Top = Top->pre_p; delete(p); } int top() { //獲得棧頂元素 return Top->num; } bool emtpy() { //判斷棧是否為空 return (Top != NULL) ? false : true; } int size() { //計算棧元素個數 node *p = Top; int cnt = 0; while (p != NULL) { p = p->pre_p; cnt++; } return cnt; } void clear() { //清空(需要把每個節點都釋放記憶體,優點:節省記憶體,缺點:時間慢) node *p = Top; Top = Top->pre_p; while (Top != NULL) { delete(p); p = Top; Top = Top->pre_p; } } }; void debug() { //測試程式碼 stack s; int a[] = { 1,2,3,4,5,6 }; printf("入棧順序:\n"); for (int i = 0; i < 6; i++) { printf("%d ", a[i]); s.push(a[i]); } printf("\n"); printf("當前棧中元素個數為:%d\n", s.size()); printf("出棧順序:\n"); while (!s.emtpy()) { int x = s.top(); s.pop(); printf("%d ", x); } printf("\n"); } int main() { debug(); return 0; }
下面是用陣列實現的stack的幾個基本用法和一個clear()的補充用法:
#include<stdio.h> const int maxn = 1e5; /* *Date:2018/10/22 *Author:Fushicho *Name:stack陣列版 *Function:push(),pop(),top(),empty(),size(),clear() */ struct stack { private: int sta[maxn]; int Top; public: stack() { //建構函式(初始化) Top = -1; } void push(int x) { //向棧頂放入一個元素 sta[++Top] = x; } void pop() { //將棧頂彈出 Top--; } int top() { //獲得棧頂元素 return sta[Top]; } bool empty() { //判斷棧是否為空 return Top >= 0 ? false : true; } int size() { //獲得棧中元素個數 return Top + 1; } void clear() { //清空(陣列模擬的優點:只需要修改棧頂編號) Top = -1; } }; void debug() { //測試程式碼 stack s; int a[] = { 1,2,3,4,5,6 }; printf("入棧順序:"); for (int i = 0; i < 6; i++) { printf("%d ", a[i]); s.push(a[i]); } printf("\n"); printf("當前棧中元素個數為:%d\n", s.size()); printf("出棧順序:"); while (!s.empty()) { int x = s.top(); s.pop(); printf("%d ", x); } printf("\n"); } int main() { debug(); return 0; }
若有不懂或者有寫錯的地方請在下方評論指出,謝謝~