1. 程式人生 > >C++ 棧(Stack)的基本操作

C++ 棧(Stack)的基本操作

一、棧的定義:

       一種可以實現“先進後出後進先出)”的儲存結構

       生活中的例子:玩具槍的子彈夾,後進來的子彈先射出。

       

二、分類:

                靜態棧:使用陣列

                動態棧:連結串列

三、演算法:

               出棧:push

                壓棧:pop

                棧是否為空:empty

                棧的大小:size

                訪問棧頂:top

四、應用:

     (1)函式中呼叫其它函式,其它函式執行完之後返回結果給上一級的函式。

     (2)中斷

     (3)表示式求值

     (4)記憶體分配

     (5)緩衝處理

     (6)迷宮

五、基本操作的實現程式:

#include <iostream>
using namespace std;

// 結點結構體
struct Node {
    int data;
    Node *next;
};

// 棧
struct Stack {
    Node *pTop; // 頂部指標
    Node *pBottom; // 底部指標
};

void Init(Stack *pS); // 初始化
void CreateStack(Stack *pS); // 建棧
void Travers(Stack *pS); // 遍歷棧
void Push(Stack *pS, int val); // 壓棧
bool Pop(Stack *pS); // 出棧:把棧頂的結點刪掉
bool getTop(Stack *pS, int &val); // 獲取棧頂元素:但不刪除棧頂結點
bool isEmpty(Stack *pS); // 判斷棧是否為空
int getSize(Stack *pS); // 獲取棧的長度

int main(int argc, const char * argv[]) {
    Stack s; // 宣告物件,等價於 struct Stack s
    int val, choose, len; // val儲存值,choose儲存使用者的選擇
    bool finished = false;
    
    while(!finished) {
        cout << "1:初始化棧:" << endl;
        cout << "2:建棧(以-1結束輸入):" << endl;
        cout << "3:遍歷棧:" << endl;
        cout << "4:壓棧:" << endl;
        cout << "5:出棧:" << endl;
        cout << "6:取棧頂的元素值:" << endl;
        cout << "7:棧是否為空:" << endl;
        cout << "8:獲取棧的長度:" << endl;
        cout << "9:退出:" << endl;
        cout << "請輸入你的選擇[1-9]:" << endl;
        cin >> choose;
        switch(choose) {
            case 1:
                Init(&s); // 初始化棧
                break;
            case 2:
                CreateStack(&s); // 建棧
                break;
            case 3:
                cout << "棧中的元素為:" << endl;
                Travers(&s); // 遍歷棧
                break;
            case 4:
                cout << "請輸入要壓入棧中的元素值:" << endl;
                cin >> val;
                Push(&s, val);
                break;
            case 5:
                if(Pop(&s)) // 出棧
                    cout << "出棧成功!" << endl;
                else
                    cout << "出棧失敗!" << endl;
                break;
            case 6:
                if(getTop(&s, val))
                    cout << "棧頂元素的值為:" << val << endl;
                else
                    cout << "棧為空!" << endl;
                break;
            case 7:
                if(isEmpty(&s))
                    cout << "棧為空!" << endl;
                else
                    cout << "棧不空" << endl;
                break;
            case 8:
                len = getSize(&s);
                cout << "棧的長度為:" << len << endl;
                break;
            case 9:
                finished = true;
                break;
            default:
                cout << "輸入選擇錯誤,請重新輸入!" << endl;
        }
    }
    return 0;
}

// 初始化
void Init(Stack *pS) {
    pS->pTop = new Node();
    if(NULL == pS->pTop) {
        cerr << "動態記憶體分配失敗!" << endl;
        exit(1);
    }
    pS->pBottom = pS->pTop; // 頂部指標和底部指標指向同一個位置
    pS->pTop->next = NULL; // pS->pBottom->next = NULL;
}

// 建棧
void CreateStack(Stack *pS) {
    int val;
    cout << "請輸入各個元素值:" << endl;
    
    while(cin >> val && val != -1)
        Push(pS, val);
}

// 壓棧
void Push(Stack *pS, int val) {
    Node *newNode = new Node(); // 新建結點
    if(NULL == newNode) {
        cerr << "動態記憶體分配失敗!" << endl;
        exit(1);
    }
    newNode->data = val;
    newNode->next = pS->pTop;
    pS->pTop = newNode; // 頂端指標往上移
}

// 遍歷棧
void Travers(Stack *pS) {
    Node *p = pS->pTop;
    
    while(p != pS->pBottom) {
        cout << p->data << " ";
        p = p->next;
    }
    cout << endl;
}

// 判斷棧是否為空:通過比較棧頂和棧尾指標是否相等,如相等,說明為空
bool isEmpty(Stack *pS) {
    if(pS->pTop == pS->pBottom)
        return true;
    return false;
}

// 出棧:把棧頂的結點刪掉
bool Pop(Stack *pS) {
    if(isEmpty(pS))
        return false;
    Node *r = pS->pTop; // 暫存頂指標
    pS->pTop = r->next; // 棧頂指標往下移一個結點
    delete r; // 釋放空間
    r = NULL; // 指向空
    return true;
}

// 獲取棧頂元素:但不刪除棧頂結點
bool getTop(Stack *pS, int &val) {
    if(isEmpty(pS)) // 棧空,返回0
        return false;
    val = pS->pTop->data;
    return true; // 否則返回棧頂的元素值
}

// 獲取棧的長度
int getSize(Stack *pS) {
    int len = 0;
    Node *p = pS->pTop;
    while(p != pS->pBottom) {
        len++;
        p = p->next;
    }
    return len;
}