用两个栈实现一个队列。
请实现它的两个函数:
appendTail:在队列尾部插入整数
deleteHead :在队列头部删除整数。(若队列中没有元素,deleteHead 操作返回 -1 )
例如:数据有①、②、③,要实现队列就要实现进入顺序为①②③,出去的顺序也为①②③
栈1:按顺序
入栈①②③,再按栈的先进后出顺序全部出栈③②①
栈2:栈1出栈后进入栈2,顺序为:入栈③②①,则栈2出栈顺序为①②③
按以上方法即实现了两个栈实现队列。
class CQueue{
stack<int> stack1,stack2;
public:
CQueue(){}
//栈1的元素全部弹出来并压入栈2底
void appendTail(int value){
stack1.push(value);
}
int deleteHead(){
while(!stack1.empty()){
int val = stack1.top();
stack1.pop();
stack2.push(val);
}
int res = -1;
if(!stack2.empty()){
res = stack2.top();
stack2.pop();
}
//删除操作之后重新放回第一个栈中
while(!stack2.empty()){
int val = stack2.top();
stack2.pop();
stack1.push(val);
}
return res;
}
};
用两个队列实现栈。
请你仅使用两个队列实现一个后进先出的栈,并支持普通栈的全部四种操作(push
、top
、pop
和 empty
)。
为实现加入顺序为①②③,输出顺序为③②①
①先进入主队列
主队列:①
辅助队列:
当②想进入主队列时,先将主队列中的出队并入队到辅助队列中
主队列:
辅助队列:①
再把②加入主队列
主队列:②
辅助队列:①
再将辅助队列中的数据出队并入队到主队列中
主队列:②①
辅助队列:
同理,加入③,主队列先出
主队列:
辅助队列:②①
主队列加入③
主队列:③
辅助队列:②①
辅助队列放回主队列
主队列:③②①
辅助队列:
主队列的出队即为③②①
class MyStack {
public:
queue<int> que1,que2;
MyStack() {
}
//将元素x压入栈顶
void push(int x) {
que2.push(x);
while(!que1.empty()){
int val = que1.front();
que1.pop();
que2.push(val);
}
swap(que1,que2);
}
//移除并返回栈顶元素
int pop() {
int val = que1.front();
que1.pop();
return val;
}
//返回栈顶元素
int top() {
return que1.front();
}
//栈空返回true,否则返回false
bool empty() {
return que1.empty();
}
};
还有:用一个队列实现栈
①进队
队列:①
想②进入时,②进队,
队列:①②
①出队后重新进队
队列:②①
③进队
队列:②①③
③之前的先出队再重新进队
队列:③②①
这样出队时的顺序为③②①,就实现了一个队列实现栈
class MyStack {
public:
queue<int> que;
MyStack() {
}
//将元素x压入栈顶
void push(int x) {
int qSize = que.size();
que.push(x);
for(int i=0; i<qSize; ++i){
int val = que.front();
que.pop();
que.push(val);
}
}
//移除并返回栈顶元素
int pop() {
int val = que.front();
que.pop();
return val;
}
//返回栈顶元素
int top() {
return que.front();
}
//栈空返回true,否则返回false
bool empty() {
return que.empty();
}
};