请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(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
操作是合法的。用两个栈来模拟队列,一个模拟队列的入口,另一个模拟队列的出口,要注意的是,在实现涉及到某个口的操作时,需要保证所有元素都在模拟那个口的栈中;
其次就是要熟悉栈stack这个容器的操作。
- class MyQueue {
- public:
- stack<int> stin; // 模拟队列的输入口
- stack<int> stout; // 模拟队列的输出口
- MyQueue() { // 由于我们是用栈来模拟的,所以这里不需要写内容
-
- }
-
- void push(int x) { // 由于我们的队列不限长度,所以要添加元素时就直接push到模拟输入口的栈里即可
- stin.push(x);
- }
-
- int pop() { // 模拟弹出队头元素
- if(stout.empty()) { // 弹出元素涉及到队列的出口,所以要判断模拟队列出口的栈是否为空
- while (!stin.empty()) { // 模拟队列出口的栈不为空,就要把入口栈的元素全部移到出口栈,这样才能弹出处于入口栈底的元素
- stout.push(stin.top()); // 将入口栈的栈顶元素取出,放入出口栈
- stin.pop(); // 注意上面的取出只是把值取出,元素还在里面,所以要pop掉
- }
- }
- int result = stout.top();
- stout.pop();
- return result;
- }
-
- int peek() {
- if (stout.empty()) {
- while (!stin.empty()) {
- stout.push(stin.top());
- stin.pop();
- }
- }
- return stout.top();
- }
-
- bool empty() {
- if (stin.empty() && stout.empty())
- return true;
- else
- return false;
- }
- };
-
- /**
- * Your MyQueue object will be instantiated and called as such:
- * MyQueue* obj = new MyQueue();
- * obj->push(x);
- * int param_2 = obj->pop();
- * int param_3 = obj->peek();
- * bool param_4 = obj->empty();
- */
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push
、top
、pop
和 empty
)。
实现 MyStack
类:
void push(int x)
将元素 x 压入栈顶。int pop()
移除并返回栈顶元素。int top()
返回栈顶元素。boolean empty()
如果栈是空的,返回 true
;否则,返回 false
。可以用两个队列实现,其实用一个队列也行。
用两个队列的话,一个是用来模拟栈的,另一个则是作为辅助队列,只能在操作中暂存元素,操作完后还得把元素还给第一个栈然后再清空。
- class MyStack {
- public:
- queue<int> q1;
- queue<int> q2;
- MyStack() {
-
- }
-
- void push(int x) {
- q1.push(x);
- }
-
- int pop() {
- int size = q1.size();
- size--;
- while (size--) {
- q2.push(q1.front());
- q1.pop();
- }
- int result = q1.front();
- q1.pop();
- q1 = q2;
- while (!q2.empty()) {
- q2.pop();
- }
- return result;
- }
-
- int top() {
- return q1.back;
- }
-
- 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();
- */
- class MyStack {
- public:
- queue<int> q;
- MyStack() {
-
- }
-
- void push(int x) {
- q.push(x);
- }
-
- int pop() {
- int size = q.size();
- size--;
- while (size--) {
- q.push(q.front());
- q.pop();
- }
- int result = q.front();
- q.pop();
- return result;
- }
-
- int top() {
- return q.back();
- }
-
- bool empty() {
- return q.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();
- */