*232. Implement Queue using Stacks

 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, and is empty operations 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.
Follow-up: Can you implement the queue such that each operation is amortized O(1) time complexity? In other words, performing n operations will take overall O(n) time even if one of those operations may take longer.

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.

双栈实现队列思路,入队 O(n), 出队 O(1)

  • S1 S2
  • 入队:为保证新元素在栈底,使用S2为新元素腾底部位置
    • 若S1空,直接入栈S1
    • 若S1不空,先把所有元素入栈S2,新元素入栈S1,再把S2的元素重新入栈S1
  • 出队:判空、top变化
  • 取队首:总是对S1判断的,S2只是临时存储的作用
  • 释放
#define MAXSIZE 100
typedef struct Stack{
    int Data[MAXSIZE];
    int TOP;
}MyStack;

typedef struct {
    MyStack S1;
    MyStack S2;
}MyQueue;

/** Initialize your data structure here. */

MyQueue* myQueueCreate() {
    MyQueue *TempQueue=(MyQueue*)malloc(sizeof(MyQueue));
    TempQueue->S1.TOP=-1;
    TempQueue->S2.TOP=-1;
    return TempQueue;
}

/** Push element x to the back of queue. */
void myQueuePush(MyQueue* obj, int x) {
    if(obj->S1.TOP!=-1){
        while(obj->S1.TOP!=-1) 
            obj->S2.Data[++(obj->S2.TOP)]=obj->S1.Data[(obj->S1.TOP)--];
    }
    obj->S1.Data[++(obj->S1.TOP)]=x;
    while(obj->S2.TOP!=-1) 
        obj->S1.Data[++(obj->S1.TOP)]=obj->S2.Data[(obj->S2.TOP)--];
}

/** Removes the element from in front of queue and returns that element. */
int myQueuePop(MyQueue* obj) {
    if(obj->S1.TOP!=-1) return obj->S1.Data[(obj->S1.TOP)--];
    return NULL;
}

/** Get the front element. */
int myQueuePeek(MyQueue* obj) {
    if(obj->S1.TOP!=-1) return obj->S1.Data[obj->S1.TOP];
    return NULL;
}

/** Returns whether the queue is empty. */
bool myQueueEmpty(MyQueue* obj) {
    if(obj->S1.TOP==-1) return true;
    return false;
}

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);
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值