C++中棧結構建立和操作

來源:互聯網
上載者:User

什麼是棧結構

棧結構是從資料的運算來分類的,也就是說棧結構具有特殊的運算規則,即:後進先出。

我們可以把棧理解成一個大倉庫,放在倉庫門口(棧頂)的貨物會優先被取出,然後再取出裡面的貨物。

而從資料的邏輯結構來看,棧結構起始就是一種線性結構。

如果從資料的儲存結構來進一步劃分,棧結構包括兩類:

順序棧結構:

即使用一組地址連續的記憶體單元依次儲存棧中的資料。在程式中,可以定義一個指定大小的結構數組來作為棧,序號為0的元素就是棧低,再定義一個變數top儲存棧頂的序號即可。

鏈式棧結構:

即使用鏈表的的形式儲存棧中各元素的值。鏈表首部(head指標所指向元素)為棧頂,鏈表尾部(指向地址為NULL)為棧底。

 

在棧結構中只能在一端進行操作,該操作端稱為棧頂,另一端稱為棧底。也就是說,儲存和取出的資料都只能從棧結構的一端進行。從資料的運算角度來分析,棧結構是按照“後進先出”的原則處理結點資料的。

在棧結構中,只有棧頂元素是可以訪問的,棧結構的資料運算也是非常簡單。一般棧結構的基本操作只有兩個:

入棧(Push):將資料儲存到棧頂的操作。進行入棧操作前,先修改棧頂指標,使其向上移一個元素位置,然後將資料儲存到棧頂指標所指的位置。

出棧(Pop):將棧頂資料彈出的操作。通過修改棧頂指標,使其指向棧中的下一個元素。

接下來,我們使用C++語言建立順序棧,並完成順序棧結構的基本運算

準備資料

準備在棧操作中需要用到的變數及資料結構等。

 

#define MAXLEN 50struct DATA{string name;int age;};struct StackType{DATA data[MAXLEN+1];int top;};
定義棧結構的長度MAXLEN,棧結構的資料元素類型DATA,以及棧結構的資料結構StackType。在資料結構StackType中,data為資料元素,top為棧頂的序號。當top=0時,表示棧為空白,當top=MAXLEN時表示棧滿。

數組元素都是充下標0開始的,這裡為了講述和理解方便,我們從下標1開始記錄資料結點,下標0的位置不用。

初始化棧結構

在使用棧結構之前,首先需要建立一個空的順序棧,也就是初始化順序棧。順序棧的初始化操作如下:

(1)按照符號常量MAXLEN指定大小申請一片記憶體空間,用來儲存棧中的資料

(2)設定棧頂指標的值為0,表示一個空棧。

範例程式碼如下:

StackType *STInit(){StackType *p;if(p=new StackType)//申請棧空間 {p->top=0;//設定棧頂為0return p;//返回棧頂指標 }return NULL;}

首先用new申請記憶體,然後設定棧頂為0,然後返回申請記憶體的首地址,申請失敗返回NULL;

判斷空棧

判斷棧結構是否為空白,如果是空棧,則表示該棧結構中沒有資料,此時可以進行入棧操作,但是不可以進行出棧操作。

範例程式碼如下:

int STIsEmpty(StackType *s){int t;t=(s->top==0);//通過棧頂的值進行判斷return t; }

輸入參數s為一個指向操作的棧的指標。根據棧頂指標top判斷是否為0,判斷棧是否為空白。

判斷滿棧

判斷棧結構是否為滿。如果是滿棧,則表示該棧結構中沒有多餘的空間來儲存額外資料。此時不可以進行入棧操作,但是可以進行進棧操作。

範例程式碼如下:

int STIsFull(StackType *s){int t;t=(s->top==MAXLEN);return t; }

輸入參數s為一個指向操作的棧的指標。根據棧頂指標top判斷是否和MAXLEN相等,判斷棧是否已滿。


清空棧

清空棧就是棧中所有的資料被清除。 範例程式碼如下:

void STClear(StackType *s){s->top=0;} 

將棧頂指標top設定為0,表示執行清空棧操作。(這裡只是邏輯上將棧中資料清空,實際上只是將top設定為0,以後再添加資料會覆蓋原來的資料)

釋放空間

釋放空間是釋放棧結構所佔用的記憶體單元,使用delete釋放用new運算子申請的記憶體空間。

範例程式碼如下:

void STFree(StackType *s){delete s;} 

在程式中直接調用delete運算子釋放已指派的記憶體空間。一般在不需要使用棧結構時調用該函數,特別是在程式結束的時候。

入棧

入棧(Push)是棧結構的基本操作,主要操作是將資料元素儲存到棧結構。入棧操作的具體步驟如下:

(1)首先判斷棧頂top,如果top大於等於MAXLEN,則表示溢出,進行出錯處理。否則執行以下操作。

(2)設定top=top+1(棧頂指標加1,指向入棧地址)

(3)將入棧呀U尿素儲存到top指向的位置。

範例程式碼如下:

int PushST(StackType *s,DATA data){if((s->top+1)>MAXLEN){cout<<"棧溢出"<<endl;return 0;}s->data[++s->top]=data;//將元素壓入棧 return 1;}

輸入參數s為一個指向操作的棧的指標,輸入參數data是需要入棧的資料元素。程式首先判斷棧是否溢出,如果溢出就給出警告,不進行入棧操作,否則修改棧頂指標,即top先加1,然後將data放到top現在指向的資料單元。

出棧

出棧(Pop)是佔據誒狗的基本操作,主要操作與入棧相反,它是從棧頂彈出一個資料元素,出棧操作的具體步驟如下:

(1)首先判斷棧頂top,如果top等於0,則表示為恐慌在哪,進行出錯處理。否則執行下面的操作。

(2)將棧頂指標top所指向的位置的元素返回(實際是返回的指標)

(3)將top的減1,指向棧的下一個元素,原來棧頂的元素被彈出。

DATA * PopST(StackType *s){if(s->top==0){cout<<"棧為空白,不能再輸出!"<<endl;exit(0);}return &(s->data[s->top--]);} 

當棧中有資料時,該函數返回值是一個指向DATA類型資料的指標。

讀取點結構

讀取點結構也就是讀取棧結構中結點的資料。由於棧結構只能在一端進行操作,因此這裡的讀操作其實就是讀網站的資料。

需要注意的是,讀節點資料的操作和出棧操作不同。讀結點操作僅僅是顯示棧頂結點資料的內容,而出棧操作則將棧頂資料彈出。

範例程式碼如下:

DATA *PeekST(StackType *s){if(s->top==0){cout<<"棧已空"<<endl;exit(0);}return &(s->data[s->top]);}

對比出棧的範例程式碼,不難發現讀取點結構同樣返回了棧頂結點的地址,但是卻沒有使top減1.

完整樣本

下面是棧的基本操作的完整樣本:

程式碼:

#include<iostream>#include<string>using namespace std;#define MAXLEN 50struct DATA{string name;int age;};struct StackType{DATA data[MAXLEN+1];int top;};/******************初始化棧結構****************/ StackType *STInit(){StackType *p;if(p=new StackType)//申請棧空間 {p->top=0;//設定棧頂為0return p;//返回棧頂指標 }return NULL;}/****************判斷空棧**********************/int STIsEmpty(StackType *s){int t;t=(s->top==0);//通過棧頂的值進行判斷return t; }/**********************判斷滿棧****************/int STIsFull(StackType *s){int t;t=(s->top==MAXLEN);return t; }/**********************清空棧**********************/void STClear(StackType *s){s->top=0;} /********************釋放空間********************/void STFree(StackType *s){delete s;} /**********************入棧***********************/int PushST(StackType *s,DATA data){if((s->top+1)>MAXLEN){cout<<"棧溢出"<<endl;return 0;}s->data[++s->top]=data;//將元素壓入棧 return 1;}/************************出棧***********************/DATA * PopST(StackType *s){if(s->top==0){cout<<"棧為空白,不能再輸出!"<<endl;exit(0);}return &(s->data[s->top--]);} /**********************讀取點結構*******************/DATA *PeekST(StackType *s){if(s->top==0){cout<<"棧已空"<<endl;exit(0);}return &(s->data[s->top]);}/*****************進入主函數**********************/int main(){StackType *stack;DATA data,*p_data;stack=STInit(); cout<<"===============入棧操作:============="<<endl;cout<<"輸入姓名 ,年齡進行入棧操作:"<<endl;//執行入棧操作 while(1){cin>>data.name>>data.age;if(data.name=="0"){break;//當姓名和年齡都是0的時候退出輸入 }else{PushST(stack,data);} }p_data=PopST(stack);cout<<"彈出棧頂元素"<<endl;cout<<"name:"<<p_data->name<<",age:"<<p_data->age<<endl;p_data=PeekST(stack);cout<<"輸出棧頂元素"<<endl;cout<<"name:"<<p_data->name<<",age:"<<p_data->age<<endl;cout<<"================將所有的的資料出棧:============="<<endl;while(1){p_data=PopST(stack);cout<<"name:"<<p_data->name<<",age:"<<p_data->age<<endl;}STFree(stack);return 0;} 

程式運行介面:



相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.