用隊列實現棧
用隊列實現棧的四個操作:
- push(x)——元素x入棧
- pop()——移出棧頂元素
- top()——獲取棧頂元素
- empty()——返回棧是否為空
注意:
- 只能使用隊列的基本操作,即只可以調用隊列的push to back,pop from front,size和is empty操作。
- 若使用的語言不支持隊列,可以使用list或者deque(雙端隊列)來模擬一個隊列。
- 假設所有的操作都是有效的,例如,對一個空的棧不會調用pop或者top操作。
棧:一種后進先出的數據結構,元素從頂端入棧,從頂端出棧。
隊列:一種先進先出的數據結構,元素從后端入隊,從前端出隊。
方法一:兩個隊列
為了滿足棧的特性,即最后入棧的元素最先出棧,在使用隊列實現棧時,應該滿足隊列前端的元素是最后入棧的元素。
可以使用兩個隊列實現棧的操作,其中queue1用于存儲棧內的元素,queue2作為入棧操作的輔助隊列。
入棧操作時,首先將元素入隊到queue2,然后將queue1的全部元素依次出隊并入到queue2,此時queue2的前端的元素即為新入棧的元素,再將queue1和queue2互換,則queue1的元素即為站內的元素,queue1的前端和后端對應棧頂和棧底。
由于每次入棧都確保queue1的前端元素為棧頂。
出棧只需要移除queue1的前端元素并返回即可,獲得棧頂元素操作只需要獲得queue1的前端元素并返回即可(不移出元素)。
class MyStack{
public:queue<int> queue1;queue<int> queue2;Mystack(){}void push(int x){queue2.push(x);while(!queue1.empty){queue2.push(queue1.front());queue1.pop();}swap(queue1,queue2);}int pop(){int r = queue1.front();queue1.pop();return r;}int top(){int r = queue1.front();return r;}bool empty(){return queue1.empty();}
}