基础知识
stack和queue不是容器,是适配器实现的,它的底层可以是list、deque或者vector这些线性表适配而来
栈和队列提供push 和 pop 等等接口,所有元素必须符合先进后出规则,所以栈不提供走访功能,也不提供迭代器(iterator)。 不像是set 或者map 提供迭代器iterator来遍历所有元素。
1.栈实现队列
232. 用栈实现队列
1.s1用来当作进队列的口;s2用来当作出队列的口
2.s1不需要什么操作,一旦push,那s1跟着push即可
2.s2如果为空,但是s1不为空,此时pop,需要把s1的值pop到s2中;但是如果s1有值,则不用做任何操作。最后把s2的值pop出去
3.peek的逻辑和pop相似,如果s2为空,需要s1pop进去,最后返回s2的top即可
4.判空就看s1和s2是不是都为空 — 不过不应该直接copy代码,复用代码更加可观
class MyQueue {
stack s1;
stack s2;
public:
MyQueue() {}
void push(int x) {
s1.push(x);
}
int pop() {
if(s2.empty())
{
while(!s1.empty())
{
s2.push(s1.top());
s1.pop();
}
}
int ret = s2.top();
s2.pop();
return ret;
}
// int peek() {
// if(s2.empty())
// {
// while(!s1.empty())
// {
// s2.push(s1.top());
// s1.pop();
// }
// }
// int ret = s2.top();
// return ret;
// }
int peek() {
int tmp = this->pop();
s2.push(tmp);
return tmp;
}
bool empty() {
if(s1.empty()&&s2.empty())
return true;
return false;
}
};
2.队列实现栈
225. 用队列实现栈
我们只需要设计两个队列
1.入队列就是将一个数据入已经有数据的队列中
2.出队列就是将已有数据的队列全部入到另一个队列中,此时我们会发现,其实最后一个出队列的就是栈先出的数据,所以我们在入队列前要判断出队列的大小是否为一,如果为一则这个数就是需要被出的数据,那么我们就不需要将它入另一个队列进去即可
class MyStack {
queue q1;
queue q2;
public:
MyStack() {}
void push(int x) {
if(q2.empty())
q1.push(x);
else
q2.push(x);
}
int pop() {
int tmp;
if(q2.empty())
{
while(q1.size()!=1)
{
q2.push(q1.front());
q1.pop();
}
tmp = q1.front();
q1.pop();
}
else
{
while(q2.size()!=1)
{
q1.push(q2.front());
q2.pop();
}
tmp = q2.front();
q2.pop();
}
return tmp;
}
int top() {
int ret = this->pop();
this->push(ret);
return ret;
}
bool empty() {
if(q1.empty()&&q2.empty())
return true;
return false;
}
};
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net