順序棧的創(chuàng)建與基本操作

概述

棧是一種限定僅在一端進(jìn)行插入和刪除的線性表。這一端被稱為棧頂(top),棧的另一端叫做棧底(bottom)。通常,最先被壓入棧中的元素會被放在棧底,后被壓入的元素處于棧頂,出棧時,取出棧頂元素,因此通常為后進(jìn)先出。

棧的經(jīng)典應(yīng)用有符號平衡的判斷,后綴表達(dá)式求值等等問題。具體代碼將在下一篇文章中給出。

基于棧的特性,一般常用的操作有:進(jìn)棧push、出棧pop、讀棧頂top、判斷棧是否為空isEmpty和判斷棧是否已滿isFull。以下為C++的抽象數(shù)據(jù)類型定義,包含基本操作。

棧類抽象數(shù)據(jù)類型定義

下面給出C++類模板,名字為Stack,模板參數(shù)為元素類型T。

template <class T>
class Stack{

public:
    void clear();
        bool push(const T item);
        bool pop(T & item);
        bool top(T & item);
        bool isEmpty();
        bool isFull();

基本操作

基本操作分為進(jìn)棧push、出棧pop、讀棧頂top等。

  • push進(jìn)棧

首先判斷棧是否已滿,即top指針是否指向棧頂,判斷句為:

//判斷棧是否已滿
if(top == mSize - 1){
        cout << "stack is full, cannot push element!" << endl;

類似的,判斷棧是否為空,即top指針是否指向棧底下一位,一般為-1,判斷句為:

//判斷棧是否為空
if(top == -1){
            cout << "empty" << endl;

當(dāng)入棧時,將top指針的元素內(nèi)容設(shè)定為value,然后將top指針上移一位修改棧頂指針,實(shí)現(xiàn)代碼如下:

//入棧
void push(T item){
    if(top == mSize - 1){
        cout << "stack is full, cannot push element!" << endl;
        return;
    }
    else{
        st[++top]=item;
        cout<<"入棧:"<<item<<endl;
    }
}
  • pop出棧

出棧時,每次只能移出棧頂元素。首先設(shè)定棧頂元素為item=stack[top],再將top指針向下移動一位,即top--。如果top=-1時(棧為空),則無法出棧,輸出empty。具體實(shí)現(xiàn)代碼如下:

void pop(int &m){
    // should be equal, not assignment
    if(top == -1){
        cout << "empty" << endl;
    }
    else{
        m=st[top--];
        cout<<"出棧:"<<m<<endl;
    }
}
  • top讀取棧頂元素

即讀取棧頂元素但不彈出。僅讓item=stack[top],top不做改變。代碼 如下:

void getop(int &t){
    if(top ==-1){
        cout<<"empty!"<<endl;
    }
    else{
        t=st[top];
        cout<<"獲得棧頂元素:"<<t<<endl;
    }
}

??傮w程序

實(shí)現(xiàn)功能:
1.首先輸入棧長度。
2.輸入操作指令:1、入棧。2、出棧。3、查看棧頂元素。4、查看棧信息(最大長度與現(xiàn)在長度)。

#include <iostream>
#include <stdio.h>

using namespace std;

template <class T>

class arrStack{
private:
    int mSize;
    int top;
    T *st;

public:
    arrStack(int size){
        mSize=size;
        top=-1;
        st=new T[mSize];
    }

    ~arrStack(){
        delete[]st;
    }

    void clear(){
        top=-1;
    }

    void push(T item){
        if(top == mSize - 1){
            cout << "stack is full, cannot push element!" << endl;
            return;
        }
        else{
            st[++top]=item;
            cout<<"入棧:"<<item<<endl;
        }
    }

    void pop(int &m){
        if(top == -1){
            cout << "empty" << endl;
        }
        else{
            m=st[top--];
            cout<<"出棧:"<<m<<endl;
        }
    }

    void getop(int &t){
        if(top ==-1){
            cout<<"empty!"<<endl;
        }
        else{
            t=st[top];
            cout<<"獲得棧頂元素:"<<t<<endl;
        }
    }

    int getMessage(int &m, int &n){
        m=mSize;
        n=top+1;
        cout<<"棧最大長度為:"<<m<<"\n棧長為:"<<n<<endl;
        return 0;
    }
};

int main(){
    int a;//length
    int e;//switch
    int i=0;
    int m;//message
    int n;//message
    int f;//pop
    int t;//getop
    int num;
    printf("請輸入棧長度:");
    cin>>a;
    arrStack<int> s(a);

    while(1){   
        cout<<"-----------------------------------------------\n"<<endl;
        cout<<"請輸入操作單位:\n1:入棧\n2:出棧\n3:獲取棧頂元素\n4:獲取棧信息\n"<<endl;
        cin>>e;
    switch(e){
        case(1):
            cout<<"請輸入入棧元素:"<<endl;
            cin >>num;
            s.push(num);
            break;
        case(2):
            s.pop(f);
            break;
        case(3):
            s.getop(t);
            break;
        case(4):
            s.getMessage(m,n);
            break;
            }
    }
    system("pause");
    return 1;
}

結(jié)果:

Paste_Image.png

總結(jié)

新手上路,有缺陷的地方望指出,進(jìn)步你我他~
現(xiàn)在再從頭寫一遍棧的內(nèi)容,感覺老師講過的東西都能明白了,也能明白她為什么這么講。
一開始剛接觸算法,不知道如何將算法和main函數(shù)結(jié)合起來,感謝導(dǎo)師幫我寫了個簡單的push(1/2/3)例子,讓我能順?biāo)浦鄣陌颜麄€程序?qū)懲辍?br> 第二個遇到的是語法上的問題。比如說指針如何使用,int函數(shù)里返回值應(yīng)該寫什么,pop函數(shù)括號里為空時如何執(zhí)行,有具體數(shù)值時如何執(zhí)行。最后我把它們都弄懂了,也算是巨大的飛躍!估計下一個鏈?zhǔn)綉?yīng)該寫的更順一些。
這是我的第一篇簡書!也是我除了hellow world的第一個真正意義上自己動手寫的c++程序!!希望十年后可以再回頭來看看它。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容