题目
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
示例1
输入: [“CQueue”,“appendTail”,“deleteHead”,“deleteHead”] [[],[3],[],[]]
输出:[null,null,3,-1]
示例 2:
输入:
[“CQueue”,“deleteHead”,“appendTail”,“appendTail”,“deleteHead”,“deleteHead”]
[[],[],[5],[2],[],[]] 输出:[null,-1,null,null,5,2]
提示:
1 <= values <= 10000
最多会对 appendTail、deleteHead 进行 10000 次调用
C++
#include <iostream>
#include <stack>
using namespace std;
class CQueue {
private:
stack<int> in;
stack<int> out;
public:
CQueue() {
}
void appendTail(int value) {
in.push(value);
}
int deleteHead() {
while (!out.empty()){
int res = out.top();
out.pop();
return res;
}
while (!in.empty()){
int tmp = in.top();
in.pop();
out.push(tmp);
}
if (out.empty()){
return -1;
}
int tmp = out.top();
out.pop();
return tmp;
}
};
int main(){
CQueue* obj = new CQueue();
obj->appendTail(2);
obj->appendTail(3);
int param_1 = obj->deleteHead();
cout<<param_1<<endl;
system("pause");
return 0;
}
Java
package offernine;
import java.util.ArrayDeque;
import java.util.Deque;
class CQueue{
private Deque<Integer> s1;
private Deque<Integer> s2;
public CQueue(){
s1 = new ArrayDeque<>();
s2 = new ArrayDeque<>();
}
public void appendTail(int value){
s1.push(value);
if (s2.isEmpty()){
move();
}
}
public int deleteHead(){
if (s2.isEmpty()){
move();
}
return s2.isEmpty() ? -1 : s2.pop();
}
public void move(){
while (!s1.isEmpty()){
s2.push(s1.pop());
}
}
}
public class offernine {
public static void main(String[] args) {
CQueue obj = new CQueue();
obj.appendTail(2);
obj.appendTail(3);
int param_1 = obj.deleteHead();
System.out.println(param_1);
}
}
python
class CQueue:
def __init__(self):
self.inStack = []
self.outStack = []
def appendTail(self, value: int) -> None:
self.inStack.append(value)
def deleteHead(self) -> int:
while len(self.outStack) != 0:
return self.outStack.pop(-1)
while len(self.inStack) != 0:
self.outStack.append(self.inStack.pop(-1))
if len(self.outStack) == 0:
return -1;
return self.outStack.pop(-1)
queued = CQueue()
queued.appendTail(2)
queued.appendTail(3)
print(queued.deleteHead())
# Your CQueue object will be instantiated and called as such:
# obj = CQueue()
# obj.appendTail(value)
# param_2 = obj.deleteHead()
Go
package main
import "fmt"
type CQueue struct {
Stack1 []int
Stack2 []int
}
func Constructor() CQueue {
return CQueue{Stack1: []int{}, Stack2: []int{}}
}
func (this *CQueue) AppendTail(value int) {
this.Stack1 = append(this.Stack1, value)
}
func (this *CQueue) DeleteHead() int {
if len(this.Stack1) == 0 && len(this.Stack2) == 0 {
return -1
}
if len(this.Stack2) > 0 {
res := this.Stack2[len(this.Stack2)-1]
this.Stack2 = this.Stack2[0 : len(this.Stack2)-1]
return res
}
for len(this.Stack1) > 0 {
this.Stack2 = append(this.Stack2, this.Stack1[len(this.Stack1)-1])
this.Stack1 = this.Stack1[0 : len(this.Stack1)-1]
}
res := this.Stack2[len(this.Stack2)-1]
this.Stack2 = this.Stack2[0 : len(this.Stack2)-1]
return res
}
func main() {
obj := Constructor()
obj.AppendTail(2)
obj.AppendTail(3)
param_1 := obj.DeleteHead()
fmt.Println(param_1)
}