資料結構 棧與佇列

2021-09-26 09:37:35 字數 2188 閱讀 5393

棧的原則是後進先出,即插入與刪除元素均在棧頂進行。 (獲取棧頂元素:s.top() )

佇列的原則是先進先出,即插入資料在隊尾進行,刪除資料在隊頭進行。  (獲取隊頭元素:q.front() )

思路:用兩個棧,乙個棧用來進隊,乙個棧用來出隊,當資料進入佇列的時候,我們將其壓入乙個棧,當資料出隊的時候,我們將儲存在棧內的資料pop出來,將其按照出棧的順序壓入另外乙個棧,然後pop棧頂的資料就實現了出隊的操作。當我們進行入隊操作的時候,可以直接將資料壓入第乙個棧。

示意圖:

實現流程:

1.stack1用來push資料:將資料push到s1前需要先將s2騰空,即把s2中的資料插入到s1中,保證stack2為空。

2.stack2用來pop資料:

當stack1不為空時,將stack1中的資料全部pop出來,按照出棧的順序壓入stack2中,然後拿到s2的棧頂元素並將其pop即可

當stack2不為空時,直接pop stack2的棧頂元素即可。

**實現:(注意:兩個棧都為空的時候是不能進行出隊操作的​​​​​​​)

class myqueue 

~myqueue()

{}//入隊

void push(int x)

s1.push(x);

}//出隊

int pop()

int ret = s2.top(); //拿到s2的top

s2.pop();

return ret;

}//獲取隊頭(即獲取轉移後的棧頂元素)

int peek()

}int ret = s2.top();

return ret;

}//判空

bool empty()

private:

stacks1;

stacks2;

};

思路:要實現乙個棧,那麼後進入的資料一定是先出去的。利用兩個佇列來進行資料順序的調整。當資料進入乙個棧時,可以先將資料push到乙個佇列當中;當需要刪除資料時,因為佇列是先進先出的,所以我們可以將隊尾的元素保留下來,其餘元素按照出隊的順序入隊到另外乙個佇列當中,然後pop第乙個佇列的最後剩下的乙個元素,這樣就實現了棧的刪除操作。

示意圖:

實現步驟:

1.push資料:在插入資料的時候,需要對佇列進行判斷,將資料插入到非空的佇列當中(都為空則預設插入q1)。這樣的話pop時我們分情況討論的時候只用分隊列為空和不為空兩種情況,有利於**的編寫。

2.pop資料:在刪除資料時,我們需要將非空佇列的隊尾資料儲存下來最後進行pop,其餘資料入隊到另外乙個佇列當中。就這樣利用兩個佇列來對資料進行來回交換實現棧。

**實現:(注意:當兩個佇列都為空的時候是沒有辦法pop資料的

class mystack 

~mystack()

{}//入棧

void push(int x)

//出棧

int pop()

ret = q1.front(); //拿到q1中僅剩的乙個元素

q1.pop();

}else //q2不為空,將q2中的size-1個元素插入q1

ret = q2.front(); //拿到q2中僅剩的乙個元素

q2.pop();

}return ret;

}//獲取棧頂元素

int top()

//判空

bool empty()

private:

queueq1;

queueq2;

};

資料結構 棧與佇列

題目 1.編寫函式,採用鏈式儲存實現棧的初始化 入棧 出棧操作 2.編寫函式,採用順序儲存實現棧的初始化 入棧 出棧操作 3.編寫函式,採用鏈式儲存實現佇列的初始化 入隊 出隊操作 4.編寫函式,採用順序儲存實現佇列的初始化 入隊 出隊操作 5.編寫乙個主函式,在主函式中設計乙個簡單的選單,分別除錯...

資料結構 棧與佇列

1.順序棧 基本操作 typedef int elemtype 定義 順序棧 typedef struct sqstack 判空 bool stackempty sqstack s 進棧 bool push sqstack s elemtype x 出棧操作 bool pop sqstack s e...

資料結構 棧與佇列

1.棧的定義 2.用棧實現鍊錶 public class stacklinked public void setdata int data public node getnext public void setnext node next private int data private node ...