1. 程式人生 > >棧和佇列面試題(三)---用兩個佇列實現一個棧

棧和佇列面試題(三)---用兩個佇列實現一個棧

一:queue是一種”先進先出”的資料結構,他在對尾插入元素,在隊頭刪除元素,他既可以取到自己的隊頭元素,也可以取到自己的隊尾元素;
stack是一種”先進後出”的資料結構,他對元素的插入和刪除都是在棧頂完成的;他不可以取自己棧底的元素;只能去取自己棧頂的元素;
所以用兩個佇列實現一個棧,就是用佇列”先進先出“的原則實現棧“先進後出”特點:
所以只要實現棧的插入,刪除,和返回棧頂元素三個方法即可;
(1)插入:每次找不為空的佇列進行插入,這樣就不存在確定的輔助佇列和主佇列之說,兩個佇列交替儲存資料;這樣效率更高;
(2)刪除;每次先找到不為空的佇列,然後將這個隊列當做主佇列,將另一個輔助佇列,將主佇列的資料依次取隊頭元素插入輔助佇列,直到主佇列剩下一個元素;然後利用棧的頭刪功能將次元素刪除;
(3)返回棧頂元素:那個佇列不為空,就取那個佇列的隊尾返回;這就是棧的棧頂元素;
二:圖說
這裡寫圖片描述

三:程式碼實現:

#include <iostream>
using namespace std;
#include <queue>

template<class T>
class Stack
{
public:
    void Push(const T& data)//插入
    {
        if (_q1.empty()&&_q2.empty())//兩個佇列都為空
        {
            _q1.push(data);//向_q1種插入元素
        } 
        else if(!_q1.empty())//q1不為空,q2為空
{ _q1.push(data);//向_q1種插入元素 } else//q1為空,q2不為空 { _q2.push(data);//向_q2種插入元素 } } void Pop()//刪除 { //if (_q1.empty()&&_q2.empty())//_q1,_q2為空 //{ // cout<<"無元素"<<endl; //} /*else*/ if
(!_q1.empty())//_q1不為空,_q2為空 { while (_q1.size()>1)//轉移元素到_q2,_q1中留下一個刪除 { _q2.push(_q1.front()); _q1.pop(); } _q1.pop();//_q1中留下一個刪除 } else //_q2不為空,_q1為空 { while (_q2.size()>1)//轉移元素到_q1,_q2中留下一個刪除 { _q1.push(_q2.front()); _q2.pop(); } _q2.pop();//_q2中留下一個刪除 } } T& Top()//取棧頂元素 { if (!_q1.empty())//如果_q1不為空,_q2為空 { return _q1.back();//返回_q1隊尾元素 } else//如果_q1為空,_q2不為空 return _q2.back(); } private: //兩個佇列成員 queue<T> _q1; queue<T> _q2; };

測試用例:

void test()
{
    Stack<int> s;
    s.Push(1);
    s.Push(2);
    s.Push(3);
    s.Push(4);
    cout<<s.Top()<<endl;
    s.Pop();
    s.Pop();
    cout<<s.Top()<<endl;
}

int main()
{
    test();
    system("pause");
    return 0;
}

四、執行結果
這裡寫圖片描述

☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺