資料結構之用兩個佇列實現乙個棧

2021-07-30 07:53:45 字數 1759 閱讀 9192

一、了解棧和佇列的基本結構

1、棧定義:棧是一種只能在一端進行插入或刪除操作的線性表。允許插入和刪除的一端被稱為

棧頂(動態變化),

另一端被稱為

棧底(固定不變),棧的插入和刪除被分別稱作入棧和

出棧。特點:

先進後出

(filo)。

儲存結構:順序棧和鏈式棧。

2、佇列

定義:隊列為一種只允許在表的一端進行插入,在一端進行刪除的受限制的線性表。允許插入的一端叫做

隊尾,允許

刪除的一端叫做

隊頭,佇列的插入和刪除被分別稱作進隊和

出隊。特點:

先進先出

(fifo)。

儲存結構:順序隊和鏈隊。

二、演算法實現

演算法一:

前提已知:

#pragma once

#include #include using namespace std;

template class stack

protected:

queueq1;

queueq2;

};

【思路】

用佇列q1進行入棧與出棧操作,佇列q2只起個中轉的作用。

入棧:直接入佇列q1即可。

出棧:把q1的除最後乙個元素外全部轉移到隊q2中,然後把剛才剩下q1中的那個元素出佇列。之後把q2

中的全部元素轉移回q1中。

【圖示】

【演算法實現】

//演算法一:佇列q1專門用來儲存和push資料,q2只是pop資料時做個中轉站

void push1(const t& data)

void pop1()

else //q1為空,就在q2中入隊,q1用作中轉站

pushtmp->push(data);//有可能在q1中入隊,也有可能在q2中入隊

} void pop2()

//讓pushtmp中的最後節點(連同最後進入的節點)出佇列

pushtmp->pop();

//交換入棧和出棧指標,減少了節點移動次數

swap(pushtmp,tmp);

} }

【完整**】

#pragma once

#include #include using namespace std;

template class stack

void pop1()

else //q1為空,就在q2中入隊,q1用作中轉站

pushtmp->push(data);//有可能在q1中入隊,也有可能在q2中入隊

} void pop2()

//讓pushtmp中的最後節點(連同最後進入的節點)出佇列

pushtmp->pop();

//交換入棧和出棧指標,減少了節點移動次數

swap(pushtmp,tmp);

} }protected:

queueq1;

queueq2;

};void test()

資料結構 兩個佇列實現乙個棧

用兩個棧實現乙個佇列,這個問題與 兩個佇列實現乙個棧 原理非常的相似。只要你明白了 兩個佇列實現乙個棧 的原理,相信聰明的你,就會明白這個問題只是它的變種,所有的異或就會迎刃而解的。這裡大家可以參考我的部落格 如下 define crt secure no warnings 1 includeusi...

資料結構 兩個佇列實現乙個棧

void stackinit stack stack 初始化 void stackdestroy stack stack 銷毀 void stackprint stack stack,const char msg 列印棧 void stackpush stack stack,datatype val...

資料結構 兩個棧實現乙個佇列

棧的特性是先進後出,佇列的特性是先進先出。那麼,我們使用兩個棧,對同乙個元素進行先進後出兩次棧就形成了先進先出的順序。即乙個元素需要入棧兩次,才能被取出來。我們將put,get定義為存放元素,與取元素。使用命名為in,out的棧,in代表往佇列裡面put元素第一次入棧是進入in,out代表get元素...