class CQueue {
Stack<Integer> a = new Stack<>(), b = new Stack<>();
public CQueue() {}
public void appendTail(int value) {
a.push(value);
}
public int deleteHead() {
if (b.empty()) {
if (a.empty()) return -1;
while (!a.empty()) b.push(a.pop());
}
return b.pop();
}
}
/**
* Your CQueue object will be instantiated and called as such:
* CQueue obj = new CQueue();
* obj.appendTail(value);
* int param_2 = obj.deleteHead();
*/
class CQueue:
def __init__(self):
self.stack_in = []
self.stack_out = []
def appendTail(self, value: int) -> None:
self.stack_in.append(value)
def deleteHead(self) -> int:
if not self.stack_out:
if not self.stack_in:
return -1
else:
while self.stack_in:
self.stack_out.append(self.stack_in.pop())
return self.stack_out.pop()
# Your CQueue object will be instantiated and called as such:
# obj = CQueue()
# obj.appendTail(value)
# param_2 = obj.deleteHead()
class CQueue {
LinkedList<Integer> A, B;
public CQueue() {
A = new LinkedList<Integer>();
B = new LinkedList<Integer>();
}
public void appendTail(int value) {
A.addLast(value);
}
public int deleteHead() {
if(!B.isEmpty()) return B.removeLast();
if(A.isEmpty()) return -1;
while(!A.isEmpty())
B.addLast(A.removeLast());
return B.removeLast();
}
}
时间O(1),空间O(N)
解题思路:
栈无法实现队列功能: 栈底元素(对应队首元素)无法直接删除,需要将上方所有元素出栈。
双栈可实现列表倒序: 设有含三个元素的栈 A = [1,2,3]A=[1,2,3] 和空栈 B = []B=[]。若循环执行 AA 元素出栈并添加入栈 BB ,直到栈 AA 为空,则 A = []A=[] , B = [3,2,1]B=[3,2,1] ,即 栈 BB 元素实现栈 AA 元素倒序 。
利用栈 BB 删除队首元素: 倒序后,BB 执行出栈则相当于删除了 AA 的栈底元素,即对应队首元素。
“`
class CQueue {
LinkedList<Integer> A, B;
public CQueue() {
A = new LinkedList<Integer>();
B = new LinkedList<Integer>();
}
public void appendTail(int value) {
A.addLast(value);
}
public int deleteHead() {
if(!B.isEmpty()) return B.removeLast();
if(A.isEmpty()) return -1;
while(!A.isEmpty())
B.addLast(A.removeLast());
return B.removeLast();
}
class CQueue {
private Stack<Integer> a;
private Stack<Integer> b;
public CQueue() {
a = new Stack<Integer>();
b = new Stack<Integer>();
}
public void appendTail(int value) {
a.push(value);
}
public int deleteHead() {
if(a.empty() && b.empty()) {
return -1;
}
if(!b.empty()) {
return b.pop();
}
while(!a.empty()) {
b.push(a.pop());
}
return b.pop();
}
}
/**
* Your CQueue object will be instantiated and called as such:
* CQueue obj = new CQueue();
* obj.appendTail(value);
* int param_2 = obj.deleteHead();
*/
class CQueue {
Stack<Integer> stackIn;
Stack<Integer> stackOut;
public CQueue() {
stackIn = new Stack<>();
stackOut = new Stack<>();
}
public void appendTail(int value) {
stackIn.push(value);
}
public int deleteHead() {
dummyStackIn();
if(stackOut.isEmpty()){
return -1;
}
return stackOut.pop();
}
public void dummyStackIn(){
while(!stackOut.isEmpty()){
return;
}
while(!stackIn.isEmpty()){
stackOut.push(stackIn.pop());
}
}
}
/**
* Your CQueue object will be instantiated and called as such:
* CQueue obj = new CQueue();
* obj.appendTail(value);
* int param_2 = obj.deleteHead();
*/
class CQueue {
//设置两个栈分别表示队列的入队和出队,入队时直接加入到“入栈”中,出队时考虑队列是否为空和“出栈”空没空
Stack<Integer> in;
Stack<Integer> out;
public CQueue() {
in = new Stack<>();
out = new Stack<>();
}
public void appendTail(int value) {
in.push(value);
}
public int deleteHead() {
if(in.empty()&&out.empty()){
return -1;
}
if(!out.empty()){
int a = out.pop();
return a;
}else{
while(!in.empty()){
out.push(in.pop());
}
int a = out.pop();
return a;
}
}
}
class CQueue {
LinkedList<Integer> stack1;
LinkedList<Integer> stack2;
public CQueue() {
stack1 = new LinkedList<>();
stack2 = new LinkedList<>();
}
public void appendTail(int value) {
stack1.add(value);
}
public int deleteHead() {
if (stack2.isEmpty()) {
if (stack1.isEmpty())
return -1;
while (!stack1.isEmpty()) {
stack2.add(stack1.pop());
}
}
return stack2.pop();
}
}
class CQueue {
LinkedList<Integer> a, b;
public CQueue() {
a = new LinkedList<>();
b = new LinkedList<>();
}
public void appendTail(int value) {
a.addLast(value);
}
public int deleteHead() {
if(!b.isEmpty()) return b.removeLast();
if(a.isEmpty()) return -1;
//利用栈的特性,后进先出放入B中,即是倒叙
while(!a.isEmpty()){
b.addLast(a.removeLast());
}
return b.removeLast();
}
}
class CQueue {
Stack<Integer> stack1;
Stack<Integer> stack2;
public CQueue() {
stack1 = new Stack<>();
stack2 = new Stack<>();
}
public void appendTail(int value) {
stack1.push(value);
}
public int deleteHead() {
if (!stack2.isEmpty()) {
return stack2.pop();
}
if (!stack1.isEmpty()) {
while(!stack1.isEmpty()) {
stack2.push(stack1.pop());
}
return stack2.pop();
}
return -1;
}
}
/**
* Your CQueue object will be instantiated and called as such:
* CQueue obj = new CQueue();
* obj.appendTail(value);
* int param_2 = obj.deleteHead();
*/
class CQueue {
//时间复杂度O(n)
//空间复杂度O(1);
private Stack<Integer> data;
private Stack<Integer> temp;
public CQueue() {
data = new Stack<>();
temp = new Stack<>();
}
public void appendTail(int value) {
temp.clear();
while (!data.isEmpty()) {
temp.push(data.pop());
}
temp.push(value);
while (!temp.isEmpty()) {
data.push(temp.pop());
}
}
public int deleteHead() {
if (data.isEmpty()) {
return -1;
}
return data.pop();
}
}
共以下 66 个回答
ab两个栈,push时加到a,pop时从b取,如果b为空,就从a取,如果a也空,就返回-1
“`c++ stack1; stack2;
class CQueue {
stack
stack
public:
CQueue() {
// 创建空队列
}
};
时间复杂度:O(1) appendTail为O(1),deleteHead为均摊O(1),对于每个元素至多入栈和出栈各两次,故均摊复杂度为O(1)【事实上最坏的时间复杂度是O(N),因为包含while循环,但由于一个元素最多只可能搬运一次,所以均摊时间复杂度为O(1)】
空间复杂度:O(n) 其中n为操作总数,对于有n次appendTail操作的情况,队列中会有n个元素,故空间复杂度为O(n)
实现思路: 利用栈先进后出、队列先进进出的特点,队列尾部插入整数用于入栈的数组push实现,队列头部删除整数,先判断用于出栈的数组是否有值,没有值则将用于入栈的数组pop出的数组push进出栈数组,实现逆置,则出栈数组pop出的数值是对头的值
时间复杂度:O(1)
空间复杂度:O(n)
这道题只需要理解,队列是先进先出,栈是先进后出,再运用两个栈就可以实现先进先出了
思路:是
232. 用栈实现队列的简化版,双栈实现队列其实就是将两个栈以相反的顺序放置(一个开口朝前s2,一个开口朝后s1),当调用 push 让元素入队时,只要把元素压入 s1 即可。调用peek查看队头元素利用栈先进后出的原则,当 s2 为空时,可以把 s1 的所有元素取出再添加进 s2,这时就是队列的先进先出顺序了。对于 pop 操作,先调用peek,只要保证s2不为空即可。Time:O(1),事实上最坏的时间复杂度是O(N),因为包含while循环,但由于一个元素最多只可能搬运一次,所以均摊时间复杂度为O(1)
Space:O(N),调用栈
两次先入先出就是正常的队列的顺序了。
栈inStack负责输入,栈outStack负责输出;
如果outStack空了,就从inStack反向推入
利用数组做成两个栈,一个进一个出
一个负责进,一个负责出
标准解法
//典中典 stin,stout;
class CQueue {
private:
stack
public:
CQueue() {
};
用deque去实现,尽管只用了stack功能,但是运行时间也快很多;
两个栈,一个进一个出,当出的栈为空时,将进的栈里的元素倾倒进出的栈
注意:在删除数据之后需要将输入栈数据导回到输出栈,以保证后面输入元素与队列的顺序保持一致
解题思路:
栈无法实现队列功能: 栈底元素(对应队首元素)无法直接删除,需要将上方所有元素出栈。
双栈可实现列表倒序: 设有含三个元素的栈 A = [1,2,3]A=[1,2,3] 和空栈 B = []B=[]。若循环执行 AA 元素出栈并添加入栈 BB ,直到栈 AA 为空,则 A = []A=[] , B = [3,2,1]B=[3,2,1] ,即 栈 BB 元素实现栈 AA 元素倒序 。
利用栈 BB 删除队首元素: 倒序后,BB 执行出栈则相当于删除了 AA 的栈底元素,即对应队首元素。
“`
class CQueue {
}
没有必要来回倒腾,第一次提交确实是欠考虑了。
空间复杂度:O(n)
思路:
“`{r} stack1; stack2;
class CQueue {
private Stack
private Stack
}
“`
我觉得好难,看到解析才有的思路。
思路:
栈是先进后出,队列是先进先出,
两个栈,进栈1,出栈1,进栈2,出栈2,按这个顺序模拟队列
进不用考虑特殊情况,
出栈时要先判断栈1是否为空,不为空时先出1进2
基本思路:首先要知道栈和队列的特性。两个栈实现,一个实现入队操作,另一个实现出队操作。当然这种做法需要的是考虑出队的那个栈中为空与为空的情况下。为空的时候,需要将栈1中的元素pop出,将其push到出队栈中。这样就能保证队列先进先出的特性。
两栈实现队列
思路:栈的特性是先进后出,队列的特性是先进先出,通过设置两个栈,入栈直接加入栈1,出栈需要将栈1 元素压入栈2后,从栈2 出
思路:栈的特性是先进后出,而队列的特性是先进先出,怎么用栈实现队列,可以用两个栈来实现,一个栈stack1负责入队的元素,一个栈负责出队的元素。当有元素e需要入队时,把元素e放进栈stack1中,当有元素需要出队时,首先看看栈stack2是否为空,stack2不为空,直接将stack2栈顶的元素出栈,作为出队的元素;stack2为空,就将栈stack1的元素全部入栈到栈stack2中,再判断stack2是否为空,为空返回-1,不为空返回stack2的栈顶元素。入队的时间复杂度为O(1),出队的时间复杂度取决于当前栈stack2是否为空,stack2不为空,出队的时间复杂度为O(1),stack2为空,出队的时间复杂度为O(stack1.size())(即取决于栈stack1里面元素的个数),空间复杂度就是元素的个数。
两个栈a和b,a栈用来存放数据,b栈存放的是的a依次出栈的数据,这样a栈出栈的顺序就刚好等于队列出队的顺序
额
题目的输入一个是操作,一个是当前操作所操作的数据,输出是返回值。
定义全局变量size,加入就++,删除就– 为0就无元素了,然后s2为空,s1不为空时候,把s1的元素给s2,
时间O(1)
空间O(n)
C语言实现
只有控制出队的栈为空的时候才能从入队的栈填充元素进来
一个存一个取
解题思路:使用栈A用于appendTail函数,deleteHead时,先从A出栈,入栈B后弹出最后一个入栈得value,注意判断B有元素,A为空的特殊情况。
时间复杂度:O(1)
空间复杂度:O(n)
一个栈用作入队,另一个栈用来出队,将入栈的值反转后出栈就是出队
python建立栈和队列太耍赖皮了
利用标准库栈的特性
开两个栈,一个进,一个出,push到进,pop管出
时间复杂度
下面代码
栈1用来添加节点,如果需要删除发现栈2为空,把栈1的所有节点出栈入栈到栈2,然后出栈栈2栈顶,如果栈2有元素则出栈栈2栈顶,如果栈1栈2都没有元素返回-1.
1、声明两个栈,栈底对栈底放置,在队列尾部添加元素,直接添加到A栈中
2、执行删除队列首部元素,先判断B栈中是否有元素,如果有则弹出B栈的栈顶元素
3、如果B栈中无元素,则在判断A中是否有元素,如果无,则返回-1
4、如果A中有元素,则执行一个循环,将A栈中元素放入B中,循环结束,再弹出B栈顶元素
空间复杂度O(n)
时间复杂度:O(1)
空间复杂度:O(n)
一个栈用于存放正常顺序的数据,当需要删除队头时,将元素逐个存入另一个栈再删除栈顶;二者均为空时,说明队列为空,另一个栈不为空时,说明当前还存有队头元素。
两个队列