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

    xiaoxiao2022-07-03  109

    题目描述:

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

    push(x) -- 元素 x 入栈 pop() -- 移除栈顶元素 top() -- 获取栈顶元素 empty() -- 返回栈是否为空

    注意:

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

    先把需要用到的队列构建好:C语言实现链表队列

    思路分析:

    1.需要用到两个队列,一个队列用来辅助 2.队列1存放数据,队列2用来搬移队列1中的元素 3.入栈操作针对于空队列,哪个队列为空就往哪个队列插入 4.总有一个队列是空的,进行出栈操作,把有元素的队列中的元素往空队列搬移,搬移到只剩一个元素 5.最后出栈前要返回这个元素的值

    代码实现:

    typedef struct { Queue q1; Queue q2; } MyStack; /** Initialize your data structure here. */ MyStack* myStackCreate() { MyStack* QS=(MyStack*)malloc(sizeof(MyStack)); if(QS==NULL) { assert(0); } QueueInit(&QS->q1); QueueInit(&QS->q2); return QS; } /** Push element x onto stack. */ void myStackPush(MyStack* obj, int x) { //哪个队列不空就入哪个 if(QueueEmpty(&obj->q1)== -1) { QueuePush(&obj->q2,x); } else { QueuePush(&obj->q1,x); } } /** Removes the element on top of the stack and returns that element. */ int myStackPop(MyStack* obj) { //把q1中的元素转移到q2,只剩下最后一个,出队就可以完成出栈 if(QueueEmpty(&obj->q1) == 1) { int size=QueueSize(&obj->q1); while(size>1) { QueuePush(&obj->q2,QueueFront(&obj->q1)); QueuePop(&obj->q1); size--; } int a=QueueFront(&obj->q1); QueuePop(&obj->q1); return a; } else { int size=QueueSize(&obj->q2); while(size>1) { QueuePush(&obj->q1,QueueFront(&obj->q2)); QueuePop(&obj->q2); size--; } int b=QueueFront(&obj->q2); QueuePop(&obj->q2); return b; } } /** Get the top element. */ int myStackTop(MyStack* obj) { if(QueueEmpty(&obj->q1) == -1) { return QueueBack(&obj->q2); } else { return QueueBack(&obj->q1); } } /** Returns whether the stack is empty. */ bool myStackEmpty(MyStack* obj) { if(QueueEmpty(&obj->q1) == -1 && QueueEmpty(&obj->q2) == -1) { return true; } return false; } void myStackFree(MyStack* obj) { free(obj); obj=NULL; } /** * Your MyStack struct will be instantiated and called as such: * MyStack* obj = myStackCreate(); * myStackPush(obj, x); * int param_2 = myStackPop(obj); * int param_3 = myStackTop(obj); * bool param_4 = myStackEmpty(obj); * myStackFree(obj); */
    最新回复(0)