C 棧和佇列的介紹與使用

2021-12-30 03:01:53 字數 3575 閱讀 6504

使用標準庫的棧和佇列時,先包含相關的標頭檔案

#include

#include

定義棧如下:

stack stk;

定義佇列如下:

queue q;

棧提供了如下的操作

s.empty() 如果棧為空返回true,否則返回false

s.size() 返回棧中元素的個數

s.pop() 刪除棧頂元素但不返回其值

s.top() 返回棧頂的元素,但不刪除該元素

s.push() 在棧頂壓入新元素佇列提供了下面的操作

q.empty() 如果隊列為空返回true,否則返回false

q.size() 返回佇列中元素的個數

q.pop() 刪除佇列首元素但不返回其值

q.front() 返回隊首元素的值,但不刪除該元素

q.push() 在隊尾壓入新元素

q.back() 返回佇列尾元素的值,但不刪除該元素它是乙個容器的改編,它實現了乙個先進後出的資料結構(filo)

使用該容器時需要包含#include標頭檔案;

定義stack物件的示例**如下:

stacks1;

stacks2;

stack的基本操作有:

1.入棧:如s.push(x);

2.出棧:如 s.pop().注意:出棧操作只是刪除棧頂的元素,並不返回該元素。

3.訪問棧頂:如s.top();

4.判斷棧空:如s.empty().當棧空時返回true。

5.訪問棧中的元素個數,如s.size();

下面舉乙個簡單的例子:

#include

#include

using namespace std;

int main(void)

cout《棧是限定僅在表尾進行插入或刪除操作的線性表,因此表尾端成為棧頂,相應的,表頭端成為棧底,不含有任何元素的棧稱為空棧。

棧的修改遵循後進先出的原則,因此棧又稱為後進先出的線性表,簡稱lifo結構。

棧一般採用陣列作為其儲存結構,這樣做可以避免使用指標,簡化程式,當然陣列需要預先宣告靜態資料區的大小,但這不是問題,因為即便是頻繁進出入棧操作,任何時刻棧元素的實際個數也不會很多,為棧預留乙個足夠大但又不占用太多空間並不是很困難,如果不能做到這一點,那麼節省記憶體的方法就是使用鍊錶儲存棧。

線性表實現棧的基本操作#include

#include

using namespace std;

typedef struct stacknode//定義鏈式棧的結構體

stacknode,*stack;

//初始化乙個鏈式棧(返回乙個鏈式棧的頭節點)

stack initstack()

//入棧

void push(stack stack,int newdata)

//找到最後乙個節點

stacknode *lastnode=stack;

while(lastnode->next)

lastnode->next=(stacknode*)malloc(sizeof(stacknode*));

lastnode->next->data=newdata;

lastnode->next->next=null;

printf("入棧成功!\n");

} //出棧

int pop(stack stack)

//找到最後乙個節點的錢乙個節點

//tempnode:最後乙個節點的前乙個節點

stacknode *tempnode=stack;

while(tempnode->next->next)

int data=tempnode->next->data;

free(tempnode->next);

tempnode->next=null;

return data;

} int main()

c++ queue(佇列)

queue模版類的定義在標頭檔案中。

queue與stack模版非常類似,queue模版也需要定義兩個模版引數,乙個是元素型別,乙個是容器型別,元素型別是必要的,容器型別是可選的,預設為dqueue型別。

定義queue物件的示例**如下:

queueq1;

queueq2;

queue的基本操作有:

1.入隊:如q.push(x):將x元素接到佇列的末端;

2.出隊:如q.pop() 彈出佇列的第乙個元素,並不會返回元素的值;

3,訪問隊首元素:如q.front()

4,訪問隊尾元素,如q.back();

5,訪問隊中的元素個數,如q.size();

二.優先佇列

在標頭檔案中,還定義了乙個非常有用的模版類priority_queue(優先佇列),優先佇列與佇列的差別在於優先佇列不是按照入隊的順序出隊,而是按照佇列中元素的優先權順序出隊(預設為大者優先,也可以通過指定運算元來指定自己的優先順序)預設是乙個大根堆。

priority_queue模版類有三個模版引數,元素型別,容器型別,比較運算元。其中後兩個都可以省略,預設容器為vector,預設運算元為less,即小的往前排,大的往後排(出隊時序列尾的元素出隊)。

定義priority_queue物件的示例**如下:

priority_queueq1;

priority_queue >q2;

priority_queue,greater >q3;//定義小的先出隊

priority_queue的基本操作均與queue相同

初學者在使用priority_queue時,最困難的可能就是如何定義比較運算元了。如果是基本資料型別,或已定義了比較運算子的類,可以直接用stl的less運算元和greater運算元——預設為使用less運算元,即小的往前排,大的先出隊。如果要定義自己的比較運算元,方法有多種,這裡介紹其中的一種:過載比較運算子。優先佇列試圖將兩個元素x和y代入比較運算子(對less運算元,呼叫xy),若結果為真,則x排在y前面,y將先於x出隊,反之,則將y排在x前面,x將先出隊。

看下面這個簡單的示例:

#include

#include

#include

using namespace std;

class t

};

bool operatorq;

q.push(t(4,4,3));

q.push(t(2,2,5));

q.push(t(1,5,4));

q.push(t(3,3,6));

while(!q.empty())

{ t t=q.top();

q.pop();

cout<

C 棧和佇列的使用

要使用標準庫的棧和佇列,首先得新增標頭檔案 include include using namespace std 定義棧 stackcurstack 定義佇列 queuecurqueue 棧的操作 curstack.empty 如果棧為空返回true,否則返回false curstack.size...

棧和佇列的使用 C

棧和佇列,都是線性結構。棧是後進先出 佇列是先進後出 include includestacks queueq 1.s.empty 如果棧s為空,返回true,否則返回false 2.s.size 返回棧的長度 3.s.pop 棧頂元素出棧 4.s.push x 把x入棧 5.s.top 返回棧頂元...

C 棧和佇列的使用

要使用標準庫的棧和佇列,首先得新增標頭檔案 include include 定義棧 stackcurstack 定義佇列 queuecurqueue 棧的操作 curstack.empty 如果棧為空返回true,否則返回false curstack.size 返回棧內元素的大小 curstack....