方维制网站,哈尔滨门户网站建设,制作简单的网页,cn域名多少钱一年用队列实现栈
题目描述 请你仅使用两个队列实现一个后入先出#xff08;LIFO#xff09;的栈#xff0c;并支持普通栈的全部四种操作#xff08;push、top、pop 和 empty#xff09;。
实现 MyStack 类#xff1a;
void push(int x) 将元素 x 压入栈顶。int pop() 移除…用队列实现栈
题目描述 请你仅使用两个队列实现一个后入先出LIFO的栈并支持普通栈的全部四种操作push、top、pop 和 empty。
实现 MyStack 类
void push(int x) 将元素 x 压入栈顶。int pop() 移除并返回栈顶元素。int top() 返回栈顶元素。boolean empty() 如果栈是空的返回 true 否则返回 false 。
输入
[MyStack, push, push, top, pop, empty]
[[], [1], [2], [], [], []]
输出
[null, null, null, 2, 2, false]
解释
MyStack myStack new MyStack();
myStack.push(1);
myStack.push(2);
myStack.top(); // 返回 2
myStack.pop(); // 返回 2
myStack.empty(); // 返回 False
解题思路 栈是一种后进先出的数据结构元素从顶端入栈然后从顶端出栈。 队列是一种先进先出的数据结构元素从后端入队然后从前端出队。 为了满足栈的特性即最后入栈的元素最先出栈在使用队列实现栈时应满足队列前端的元素是最后入栈的元素。可以使用两个队列实现栈的操作其中queue1用于存储栈内的元素queue2作为入栈操作的辅助队列。 入栈操作时首先将元素入队到 queue2然后将 queue1的全部元素依次出队并入队到 queue2,此时 queue2的前端的元素即为新入栈的元素再将 queue1和 queue2互换则 queue1的元素即为栈内的元素queue1的前端和后端分别对应栈顶和栈底。 由于每次入栈操作都确保 queue1的前端元素为栈顶元素因此出栈操作和获得栈顶元素操作都可以简单实现。出栈操作只需要移除 queue1的前端元素并返回即可获得栈顶元素操作只需要获得 queue1的前端元素并返回即可不移除元素。 由于 queue1用于存储栈内的元素判断栈是否为空时只需要判断 queue1是否为空即可。 复杂度分析 时间复杂度入栈操作O(n),其余操作都是O(1),n是栈内的元素个数 空间复杂度O(n),需要使用两个队列存储站内的元素 代码
#include queue
#include array
#include iostream
using namespace std;
class MyStack
{
public:queueint queue1;queueint queue2;/** 初始化栈. */MyStack(){}/** 向栈内添加元素. */void push(int x){queue2.push(x);while (!queue1.empty()){queue2.push(queue1.front());queue1.pop();}swap(queue1, queue2);}/** 移除栈顶元素 */int pop(){int r queue1.front();queue1.pop();return r;}/** 返回栈顶元素. */int top(){int r queue1.front();return r;}/** 返回栈是否为空. */bool empty(){return queue1.empty();}
};
int main()
{MyStack myStack;myStack.push(1);myStack.push(2);cout myStack.top() endl; // 返回 2cout myStack.pop() endl;; // 返回 2cout myStack.empty() endl; // 返回 False
}
用栈实现队列
题目描述
链接简单232.用栈实现队列 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作push、pop、peek、empty
实现 MyQueue 类
void push(int x) 将元素 x 推到队列的末尾代码int pop() 从队列的开头移除并返回元素int peek() 返回队列开头的元素boolean empty() 如果队列为空返回 true 否则返回 false
说明
你 只能 使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。你所使用的语言也许不支持栈。你可以使用 list 或者 deque双端队列来模拟一个栈只要是标准的栈操作即可。
解题思路 将一个栈当作输入栈用于压入 push传入的数据另一个栈当作输出栈用于 pop和 peek操作。每次 pop或 peek时若输出栈为空则将输入栈的全部数据依次弹出并压入输出栈这样输出栈从栈顶往栈底的顺序就是队列从队首往队尾的顺序。 复杂度分析 时间复杂度push和 emptyO(1)pop和 peek为均摊 O(1)。对于每个元素至多入栈和出栈各两次故均摊复杂度为 O(1)。 空间复杂度O(n)。其中 n是操作总数。对于有 n次 push操作的情况队列中会有 n个元素故空间复杂度为 O(n)。 代码
#include stack
#include iostream
using namespace std;
class MyQueue
{
public:MyQueue(){}void push(int x){// 1.把s1所有元素弹出后依次放入s2while (!s1.empty()){s2.push(s1.top());s1.pop();}// 2.新元素加入到s2顶部s2.push(x);// 3.把s2所有元素弹出后依次放入s1while (!s2.empty()){s1.push(s2.top());s2.pop();}}int pop(){int ret s1.top();s1.pop();return ret;}int peek(){return s1.top();}bool empty(){return s1.empty();}private:stackint s1;stackint s2;
};
int main()
{MyQueue myQueue;myQueue.push(1); // queue is: [1]myQueue.push(2); // queue is: [1, 2] (leftmost is front of the queue)cout myQueue.peek() endl; // return 1cout myQueue.pop() endl; // return 1, queue is [2]cout myQueue.empty() endl; // return false
}