原题网址:https://www.lintcode.com/zh-cn/old/problem/implement-queue-by-two-stacks/#
40. 用栈实现队列
讨论区
正如标题所述,你需要使用两个栈来实现队列的一些操作。
队列应支持push(element),pop() 和 top(),其中pop是弹出队列中的第一个(最前面的)元素。
pop和top方法都应该返回第一个元素的值。
样例
比如push(1), pop(), push(2), push(3), top(), pop(),你应该返回1,2和2
挑战
仅使用两个栈来实现它,不使用任何其他数据结构,push,pop 和 top的复杂度都应该是均摊O(1)的
标签
挑战的要求是不使用任何其他数据结构,这里不清楚使用int 型变量保存头结点数值是否属于使用其他数据结构?
以及push,pop 和 top的复杂度都应该是均摊O(1)的,啥叫均摊……?一脸懵逼 =_=
我自己的思路:创建一个int型数据成员first保存头结点数值,再创建一个stack<int>型的 m_s 保存队列数据;
1 push元素时,判断 m_s 是否为空,为空则first=element,不为空保持原来的值不变;
2 top就直接return first;
3 pop,先创建临时变量保存first,最后要return出去。然后定义一个stack<int>型的中间变量temp,将m_s中的值倒着压入temp中,弹出temp尾部元素(即队列顶部元素),此时temp的新尾部即为队列的新头结点,将其赋值给frist。然后将temp中的元素再倒着压入m_s中,队列更新完毕。【注意:对stack型变量top或者pop时要先进行判空!本题的条件pop可以不判断,但top不加判空的话,若队列只有一个元素,pop后再top程序出错,哎……第一次运行时就这么栽了,还排查了半天,蠢哭】
AC代码:
class MyQueue {
public:
MyQueue() {
// do intialization if necessary
}
/*
* @param element: An integer
* @return: nothing
*/
void push(int element) {
// write your code here
if (m_s.empty())
{
First=element;
}
m_s.push(element);
}
/*
* @return: An integer
*/
int pop() {
// write your code here
int result=First;
stack<int> temp;
while(!m_s.empty())
{
temp.push(m_s.top());
m_s.pop();
}
temp.pop();//犯蠢了,如果temp弹出栈顶元素后为空,top操作会出错;
if (!temp.empty())//所以这里一定要加判空;
{
First=temp.top();
}
while(!temp.empty())
{
m_s.push(temp.top());
temp.pop();
}
return result;
}
/*
* @return: An integer
*/
int top() {
// write your code here
return First;
}
int First; //存储队列头;
stack<int> m_s;//存储元素;
};
其他方法:
https://blog.csdn.net/ljlstart/article/details/48517213
每次上网一搜索其他思路就会感慨大神何其多,自己还差得远呢。
设置两个栈,入队列的元素存放在s1中,出队列时元素都从s2中出。
push时直接把元素加到s1中;
pop时保存s2尾部数据以便最后return出去,然后弹出该元素。这里首先要先判断s2是否为空,若为空,将s1中元素倒着插入到s2中(这样s1是空栈,push时不影响);
top同理pop,只是少了一部弹出元素的操作。
AC代码:
class MyQueue {
public:
MyQueue() {
// do intialization if necessary
}
void push(int element) {
// write your code here
s1.push(element);
}
int pop() {
// write your code here
if (s2.empty())
{
while(!s1.empty())
{
s2.push(s1.top());
s1.pop();
}
}
int r=s2.top();
s2.pop();
return r;
}
int top() {
// write your code here
if (s2.empty())
{
while(!s1.empty())
{
s2.push(s1.top());
s1.pop();
}
}
return s2.top();
}
stack<int> s1;//存放入队元素;
stack<int> s2;//元素从这里弹出;
};