Implement a first in first out (FIFO) queue using only two stacks. The implemented queue should support all the functions of a normal queue (push, peek, pop, and empty).
Implement the MyQueue class:
void push(int x)Pushes element x to the back of the queue.int pop()Removes the element from the front of the queue and returns it.int peek()Returns the element at the front of the queue.boolean empty()Returns true if the queue is empty, false otherwise.
Notes
- You must use only standard operations of a stack, which means only
push to top,peek/pop from top,size, andis emptyoperations are valid. - Depending on your language, the stack may not be supported natively. You may simulate a stack using a list or deque (double-ended queue) as long as you use only a stack's standard operations.
Example 1
Input
["MyQueue", "push", "push", "peek", "pop", "empty"]
[[], [1], [2], [], [], []]
Output
[null, null, null, 1, 1, false]
Explanation
MyQueue myQueue = new MyQueue();
myQueue.push(1); // queue is: [1]
myQueue.push(2); // queue is: [1, 2] (leftmost is front of the queue)
myQueue.peek(); // return 1
myQueue.pop(); // return 1, queue is [2]
myQueue.empty(); // return false
Constraints
- 1 <= x <= 9
- At most 100 calls will be made to push, pop, peek, and empty.
- All the calls to pop and peek are valid.
Solution
一个入队用的栈,一个出队用的栈。
入队时:
- 全部压入入队栈
出队时:
- 如果出队栈非空,直接把出队栈的栈顶元素弹出即出队元素
- 如果出队栈为空,把入队栈的元素全部压入出队栈,出队栈的栈顶元素即为出队元素;
typedef struct {
int istack[100];
int ostack[100];
int itop, otop;
} MyQueue;
MyQueue* myQueueCreate() {
MyQueue* obj = (MyQueue*)malloc(sizeof(MyQueue));
obj->itop = obj->otop = 0;
return obj;
}
void myQueuePush(MyQueue* obj, int x) {
if (obj->itop < 100) obj->istack[obj->itop++] = x;
}
int myQueuePop(MyQueue* obj) {
if (obj->otop) return obj->ostack[--obj->otop];
while (obj->itop) obj->ostack[obj->otop++] = obj->istack[--obj->itop];
return obj->ostack[--obj->otop];
}
int myQueuePeek(MyQueue* obj) {
if (obj->otop) return obj->ostack[obj->otop - 1];
else return obj->istack[0];
}
bool myQueueEmpty(MyQueue* obj) {
return !obj->itop && !obj->otop;
}
void myQueueFree(MyQueue* obj) {
free(obj);
}
/**
* Your MyQueue struct will be instantiated and called as such:
* MyQueue* obj = myQueueCreate();
* myQueuePush(obj, x);
* int param_2 = myQueuePop(obj);
* int param_3 = myQueuePeek(obj);
* bool param_4 = myQueueEmpty(obj);
* myQueueFree(obj);
*/