劍指offer 用兩個棧實現佇列

2021-07-25 11:39:18 字數 1432 閱讀 9150

記錄《劍指offer》上的演算法題。

題目描述如下:

佇列的宣告如下:

template

class cqueue

~cqueue(){}

t deletehead();

bool empty()

private:

stack

stack1;

stack

stack2;

};

實現的**如下:

templatet>

stack1.push(node);

}template t>

t cqueue::deletehead()

}if (stack2.size() == 0)

throw std::exception("queue is empty");

t head = stack2.top();

stack2.pop();

return head;

}

實現的思路是使用stack1來儲存插入的資料,而需要刪除的時候,先將stack1的元素都壓入stack2中,此時得到的stack2的棧頂元素就是最先插入的元素,並且依次刪除stack2的元素得到的元素也是按順序插入佇列的元素順序,也就是刪除的時候先彈出stack2的元素,如果它為空,則檢視stack1中是否也是空,如果是空,說明佇列是空,不是空,則先彈出到stack2中,然後再依次彈出stack2的元素。

相關的乙個題目是用兩個佇列實現乙個棧,實現的思路是,壓入元素的時候將元素都壓入非空的佇列,然後在彈出元素的時候,將非空佇列的元素都壓入另乙個空的佇列,除了隊尾元素,此時隊尾元素就是最後壓入棧的元素,也是彈出的第乙個元素。

實現**如下:

#ifndef cstack_h_

#define cstack_h_

#include

using

std::queue;

template

class cstack

~cstack(){}

t remove();

bool empty()

private:

queue

q1;queue

q2;};template

// 插入首選非空的佇列,當兩個佇列都空的時候,預設插入佇列1

if (q1.empty())

else

}template

t cstack::remove()

res = q2.front();

q2.pop();

}else

res = q1.front();

q1.pop();

}return res;

}#endif

完整的**例子可以檢視我的github。

劍指offer 用兩個棧實現佇列

華電北風吹 天津大學認知計算與應用重點實驗室 日期 2015 9 30 題目描述 用兩個棧來實現乙個佇列,完成佇列的push和pop操作。佇列中的元素為int型別。解析 我的思路是用乙個棧來儲存資料,入隊的話直接在這個棧上入棧,出隊的話借助輔助棧,對輔助棧入棧,然後取出頭元素,然後把輔助棧上的元素在...

用兩個棧實現佇列《劍指offer

題目描述 用兩個棧來實現乙個佇列,完成佇列的push和pop操作。佇列中的元素為int型別。解題思路 將元素入隊時壓入乙個棧中,隨後通過另乙個棧出隊 1 使用stack容器定義兩個棧 stack stack1 stack stack2 2 入隊 stack1.push node node為入隊元素 ...

劍指offer 用兩個棧實現佇列

題目描述 用兩個棧來實現乙個佇列,完成佇列的push和pop操作。佇列中的元素為int型別。思路 首先搞清楚棧和佇列的區別,主要是出操作,出棧的時候元素 先進後出 出佇列的時候元素 先進先出 順序正好相反。所以考慮有兩個棧,棧a用來讀取資料,當需要模擬佇列的出操作時,將棧a裡的資料取出放到棧b,再從...