void push(int x) 将元素 x 压入栈顶。
int pop() 移除并返回栈顶元素。
int top() 返回栈顶元素。
boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。
*/
class MyStack {
public:
queue q1;
queue q2;
MyStack() {}
//插入元素,每次插入都把元素放在栈顶,即队头
void push(int x) {
q2.push(x);
while(!q1.empty()){
q2.push(q1.front());
q1.pop();
}
swap(q1,q2);
}
int pop() {
int r = q1.front();
q1.pop();
return r;
}
int top() {
int r = q1.front();
return r;
}
bool empty(){
return q1.empty();
}
};
/**
* Your MyStack object will be instantiated and called as such:
* MyStack* obj = new MyStack();
* obj->push(x);
* int param_2 = obj->pop();
* int param_3 = obj->top();
* bool param_4 = obj->empty();
*/
public:
/** Initialize your data structure here. */
MyStack() {
}
/** Push element x onto stack. */
void push(int x) {
// 反转队列,将新元素插到队头
int size = q.size();
q.push(x);
while (size--){
int temp = q.front();
q.pop();
q.push(temp);
}
}
/** Removes the element on top of the stack and returns that element. */
int pop() {
int popEle = q.front();
q.pop();
return popEle;
}
/** Get the top element. */
int top() {
return q.front();
}
/** Returns whether the stack is empty. */
bool empty() {
return q.empty();
}
//用一个队列做出栈
//另一个人做临时存储 新来元素保持在出栈队列的头部 就得用先把出栈队列所有元素放入临时存储队列 再放新到出栈队列头
Queue out;
Queuein;
public MyStack() {
out = new LinkedList();
in = new LinkedList();
}
public void push(int x) { //放入
if(out.size()==0)
{
out.add(x);
}else{
while(out.size()!=0)
{
in.add(out.remove());
}
out.add(x);
while(in.size()!=0)
{
out.add(in.remove());
}
}
}
public int pop() {
return out.remove();
}
public int top() {
return out.peek();
}
public boolean empty() {
if(out.size()!=0)
{
return false;
}else
{
return true;
}
}
class MyStack {
public:
queue<int> q;
MyStack() {
}
void push(int x) {
int n = q.size();
q.push(x);
for (int i = 0; i < n; i++) {
q.push(q.front());
q.pop();
}
}
int pop() {
int r = q.front();
q.pop();
return r;
}
int top() {
int r = q.front();
return r;
}
bool empty() {
return q.empty();
}
};
class MyStack {
Queue<Integer> A, B;
public MyStack() {
A = new LinkedList<Integer>();
B = new LinkedList<Integer>();
}
public void push(int x) {
B.offer(x);
while (!A.isEmpty()) {
B.offer(A.poll());
}
//交换A和B
Queue<Integer> temp = A;
A = B;
B = temp;
}
public int pop() {
return A.poll();
}
public int top() {
return A.peek();
}
public boolean empty() {
return A.isEmpty();
}
}
static class MyStack {
// 每次都在in里面插入,出队等操作 插完了就swap就可以形成倒叙了
// offer就是尾插,pop就是从头拿
// 插入的时候一个一个的来 慢慢的保持栈的基本结构
Queue<Integer> in;
Queue<Integer> out;
/** Initialize your data structure here. */
public MyStack() {
in = new LinkedList<Integer>();
out = new LinkedList<Integer>();
}
/** Push element x onto stack. */
public void push(int x) {
in.offer(x);
while (!out.isEmpty()) {
out.offer(in.poll());
}
Queue<Integer> temp = in;
in = out;
out = temp;
}
/** Removes the element on top of the stack and returns that element. */
public int pop() {
return in.poll();
}
/** Get the top element. */
public int top() {
return in.peek();
}
/** Returns whether the stack is empty. */
public boolean empty() {
return in.isEmpty();
}
}
public class QStack {
Queue<Integer> queue1;
Queue<Integer> queue2;
Queue<Integer> queue3;
public QStack() {
queue1 = new LinkedList<Integer>();
queue2 = new LinkedList<Integer>();
}
// 入栈
public void push(int value) {
//入队q2
queue2.offer(value);
// 把q1的元素全入队q2
while (!queue1.isEmpty()) {
queue2.offer(queue1.poll());
}
// q1和q2互换元素
Queue<Integer> temp = queue1;
queue1 = queue2;
queue2 = temp;
}
// 一个队列实现
public void push2(int value) {
int n = queue3.size();
queue3.offer(value);
for (int i = 0; i < n; ++i){
queue3.offer(queue3.poll());
}
}
public int pop() {
return queue1.poll();
}
/** Get the top element. */
public int top() {
return queue1.peek();
}
/** Returns whether the stack is empty. */
public boolean empty() {
return queue1.isEmpty();
}
}
class MyStack {
private Queue<Integer> a;//输入队列
private Queue<Integer> b;//输出队列
public MyStack() {
a = new LinkedList<>();
b = new LinkedList<>();
}
public void push(int x) {
a.offer(x);
//将b队列中的元素全部转给a队列
while(!b.isEmpty())a.offer(b.poll());
//交换a和b,使得a队列没有在push()的时候始终为空队列
Queue temp = a;
a = b;
b = temp;
}
public int pop() {
return b.poll();
}
public int top() {
return b.peek();
}
public boolean empty() {
return b.isEmpty();
}
}
/**
* Your MyStack object will be instantiated and called as such:
* MyStack obj = new MyStack();
* obj.push(x);
* int param_2 = obj.pop();
* int param_3 = obj.top();
* boolean param_4 = obj.empty();
*/
class MyStack {
Queue<Integer> queue;
public MyStack() {
queue =new LinkedList<Integer>();
}
public void push(int x) {
int n = queue.size();
queue.offer(x);
for(int i = 0;i < n;i++){
queue.offer(queue.poll());
}
}
public int pop() {
return queue.poll();
}
public int top() {
return queue.peek();
}
public boolean empty() {
return queue.isEmpty();
}
}
/**
* Your MyStack object will be instantiated and called as such:
* MyStack obj = new MyStack();
* obj.push(x);
* int param_2 = obj.pop();
* int param_3 = obj.top();
* boolean param_4 = obj.empty();
*/
四
class MyStack {
Queue queue1;
Queue queue2;
public MyStack() {
queue1 = new LinkedList();
queue2 = new LinkedList();
}
public void push(int x) {
queue2.offer(x);
while (!queue1.isEmpty()) {
queue2.offer(queue1.poll());
}
Queue<Integer> temp = queue1;
queue1 = queue2;
queue2 = temp;
}
public int pop() {
return queue1.poll();
}
public int top() {
return queue1.peek();
}
public boolean empty() {
return queue1.isEmpty();
}
}
/**
* Your MyStack object will be instantiated and called as such:
* MyStack obj = new MyStack();
* obj.push(x);
* int param_2 = obj.pop();
* int param_3 = obj.top();
* boolean param_4 = obj.empty();
*/
class MyStack {
Deque<Integer> deque = new ArrayDeque<>();
public MyStack() {
}
public void push(int x) {
deque.addFirst(x);
}
public int pop() {
return deque.removeFirst();
}
public int top() {
return deque.peekFirst();
}
public boolean empty() {
return deque.isEmpty();
}
}
class MyStack {
Deque deq;
public MyStack() {
deq = new LinkedList<>();
}
public void push(int x) {
deq.offerFirst(x);
}
public int pop() {
return deq.pollFirst();
}
public int top() {
return deq.peekFirst();
}
public boolean empty() {
return deq.isEmpty();
}
}
/**
* Your MyStack object will be instantiated and called as such:
* MyStack obj = new MyStack();
* obj.push(x);
* int param_2 = obj.pop();
* int param_3 = obj.top();
* boolean param_4 = obj.empty();
*/
共以下 44 个回答
用队列实现栈 cpp
用辅助队列完成入栈操作,队列A保存栈中的元素,新元素入栈时,将新元素放入空队列B,再将队列A中的元素依次出栈存入队列B,交换队列B和队列A,此时队列A中的元素按照从栈顶到栈底的顺序排列。时间复杂度O(n),空间复杂度O(n)。
其他操作时间复杂度O(1)
// queue
1
用于存储栈内的元素,queue2\textit{queue}_2queue
2
作为入栈操作的辅助队列。
入栈操作时,首先将元素入队到 queue2\textit{queue}_2queue Qqueue1; Qqueue2;
2
,然后将 queue1\textit{queue}_1queue
1
的全部元素依次出队并入队到 queue2\textit{queue}_2queue
2
,此时 queue2\textit{queue}_2queue
2
的前端的元素即为新入栈的元素,再将 queue1\textit{queue}_1queue
1
和 queue2\textit{queue}_2queue
2
// 空间复杂度on 时间复杂度入队on 其他都是o1
class MyStack {
Queue
Queue
}
执行用时:
4 ms
/*
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。
实现 MyStack 类:
void push(int x) 将元素 x 压入栈顶。
int pop() 移除并返回栈顶元素。
int top() 返回栈顶元素。
boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。
*/
class MyStack { q1; q2;
public:
queue
queue
};
/**
* Your MyStack object will be instantiated and called as such:
* MyStack* obj = new MyStack();
* obj->push(x);
* int param_2 = obj->pop();
* int param_3 = obj->top();
* bool param_4 = obj->empty();
*/
class MyStack { q;
private:
queue
public:
/** Initialize your data structure here. */
MyStack() {
};
class MyStack {
}
时间复杂度:O(n)
空间复杂度:O(n)
//用一个队列做出栈 out; in; (); ();
//另一个人做临时存储 新来元素保持在出栈队列的头部 就得用先把出栈队列所有元素放入临时存储队列 再放新到出栈队列头
Queue
Queue
public MyStack() {
out = new LinkedList
in = new LinkedList
}
}
用队列实现栈
入栈O(n) 其他都是O(1) 空间上O(n)
TS,一直觉得这道题比另一个难理解
代码
c++ 代码 用双队列模拟栈 inQueue,outQueue;
class MyStack {
queue
public:
MyStack() {
}
}; inQueue,outQueue;
c++代码在之前的基础上做了些修改用单队列也可以实现
class MyStack {
queue
public:
MyStack() {
}
};
“`c++ q;
class MyStack {
public:
queue
MyStack() {
int s;
s=q.size();
q.push(x);
while(s–)//// 反转队列,将新元素插到队头
{
int t=q.front();
q.pop();
q.push(t);
}
}
int ans=q.front();
q.pop();
return ans;
}
return q.front();
}
return q.empty();
}
};
用队列实现栈
这道题用两种队列可以实现,也可以用一种队列实现,但是其核心思想是一样的
那就是让队列进行反转,先进去队列的让其最后进去
最后实现队头表示栈顶,队尾表示栈底
stack2是存放新入对的数组,再将队列1中的数据压入2中,交换1 和 2 就可以实现一个栈的push操作
数组队尾为栈头,辅助数组负责存放历史数据
时间复杂度O(N)
空间复杂度O(N)
Day4:下面是代码
”’java que1; que2;//用来备份
class MyStack {
//使用两个队列实现先入后出的栈
Queue
Queue
public MyStack() {
this.que1 = new LinkedList<>();
this.que2 = new LinkedList<>();
}
}
”’
LeetCode 225. 用队列实现栈
代码如下
四 queue1; queue2; (); ();
class MyStack {
Queue
Queue
public MyStack() {
queue1 = new LinkedList
queue2 = new LinkedList
}
}
/**
* Your MyStack object will be instantiated and called as such:
* MyStack obj = new MyStack();
* obj.push(x);
* int param_2 = obj.pop();
* int param_3 = obj.top();
* boolean param_4 = obj.empty();
*/
push 操作:O(1)
pop() 操作: O(n)
top() 操作: O(1)
入栈时 将队列中的前n-1个元素出队并放入队尾 这样队头就是栈顶元素
Deque既可以作为栈,又可以作为队列
所以今天打卡的两题,都可以用这个数据结构来解
值得学习!
时间复杂度:O(n)
空间复杂度:O(n)
时间复杂度:O(n)
空间复杂度:O(n)