【数据结构---21】用栈实现队列的操作

    xiaoxiao2022-07-04  115

    题目描述:

    使用栈实现队列的下列操作:

    push(x) -- 将一个元素放入队列的尾部 pop() -- 从队列首部移除元素 peek() -- 返回队列首部的元素 empty() -- 返回队列是否为空

    示例: MyQueue queue = new MyQueue(); queue.push(1); queue.push(2); queue.peek(); // 返回 1 queue.pop(); // 返回 1 queue.empty(); // 返回 false

    说明:

    你只能使用标准的栈操作 -- 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的 你所使用的语言也许不支持栈 你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可 假设所有操作都是有效的 (例如,一个空的队列不会调用 pop 或者 peek 操作)

    先把需要用到的栈构建好:C语言实现一个动态栈

    思路分析:

    1.使用两个栈来完成对队列的模拟 2.一个栈用来辅助中转元素,一个栈主要用来存放数据 3.入队操作全部对于s1进行,出队操作首先将s1中的元素压入s2,然后s2的栈顶就是队头,将值保存后删除,然后再把s2的元素全部转入s1,恢复原本的结构 4.获取队头元素和出队操作一致,只是不删除s2的栈顶元素即可

    代码实现:

    typedef struct { Stack s1; Stack s2; } MyQueue; /** Initialize your data structure here. */ MyQueue* myQueueCreate() { MyQueue* SQ=(MyQueue*)malloc(sizeof(MyQueue)); if(SQ==NULL) { assert(0); } StackInit(&SQ->s1); StackInit(&SQ->s2); return SQ; } /** Push element x to the back of queue. */ void myQueuePush(MyQueue* obj, int x) { StackPush(&obj->s1,x); } /** Removes the element from in front of queue and returns that element. */ int myQueuePop(MyQueue* obj) { //队列的Pop是头删,删除栈底元素 while(obj->s1.top>0) { StackPush(&obj->s2,StackTop(&obj->s1)); StackPop(&obj->s1); } int a=StackTop(&obj->s2); StackPop(&obj->s2); //然后恢复本来的结构 while(obj->s2.top>0) { StackPush(&obj->s1,StackTop(&obj->s2)); StackPop(&obj->s2); } return a; } /** Get the front element. */ int myQueuePeek(MyQueue* obj) { while(obj->s1.top>0) { StackPush(&obj->s2,StackTop(&obj->s1)); StackPop(&obj->s1); } int a=StackTop(&obj->s2); //然后恢复本来的结构 while(obj->s2.top>0) { StackPush(&obj->s1,StackTop(&obj->s2)); StackPop(&obj->s2); } return a; } /** Returns whether the queue is empty. */ bool myQueueEmpty(MyQueue* obj) { if(StackEmpty(&obj->s2) == -1 && StackEmpty(&obj->s1) == -1) { return true; } return false; } void myQueueFree(MyQueue* obj) { free(obj); obj=NULL; } /** * 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); */
    最新回复(0)