栈是不是栈,队列也不是队列---队列实现栈,栈实现队列

Posted 你快看看我

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了栈是不是栈,队列也不是队列---队列实现栈,栈实现队列相关的知识,希望对你有一定的参考价值。

一、队列实现栈

1.实现思路

假设需要用栈存储1,2,3,4,则出栈顺序是4,3,2,1.
用队列存储1,2,3,4直接出队是1,2,3,4.如果队列和栈中都只有一个数字,那么入栈出栈和入队出队就是一样的。
我们使用两个队列来实现栈,队列q1和队列q2,起始两个队列都为空,我们将n个元素存入任何一个都可以,我们存入q1并且以1,2,3,4的方式一次入队。

现在我们将前n-1个数字出队并依次存入q2中,此时q1中只剩下1个元素并且是刚刚入队时的最后一个元素,把这个元素直接出队,此时出队以后q1为空。

在将q2中剩下的n-1个元素一次入队到q1中,此时q2中只剩下一个元素时,出队。

每次都将n-1个元素入队到另一个为空的队列中,剩下的一个出队,直到两个元素都为空时,出队的顺序就是使用栈时出栈的顺序。

2.实现代码

以下为队列实现栈做铺垫,先完成队列的实现
具体解释可以参考上一篇文章“栈和队列”

(1)创建一个队列实现的栈

因为我们需要两个队列来完成栈的实现

typedef struct 

    Queue q1;
    Queue q2;
 MyStack;

/** Initialize your data structure here. */

MyStack* myStackCreate() 

    MyStack* pst=(MyStack*)malloc(sizeof(MyStack));
    QueueInit(&pst->q1);
    QueueInit(&pst->q2);
    return pst;

(2)将一个元素压入栈中

/** Push element x onto stack. */
void myStackPush(MyStack* obj, int x) 

    if(!QueueEmpty(&obj->q1))
    
        QueuePush(&obj->q1,x);
    
    else
    
        QueuePush(&obj->q2,x);
    

(3)删除栈顶元素并返回

/** Removes the element on top of the stack and returns that element. */
int myStackPop(MyStack* obj) 

    Queue* pEmpty=&obj->q1;
    Queue* pNonEmpty=&obj->q2;
    if(!QueueEmpty(&obj->q1))
    
        pEmpty=&obj->q2;
        pNonEmpty=&obj->q1;
    
    while(QueueSize(pNonEmpty)>1)
    
        QueuePush(pEmpty,QueueFront(pNonEmpty));
        QueuePop(pNonEmpty);
    
    int front=QueueFront(pNonEmpty);
    QueuePop(pNonEmpty);
    return front;


(4)取栈顶元素

/** Get the top element. */
int myStackTop(MyStack* obj) 

    if(!QueueEmpty(&obj->q1))
    
        return QueueBack(&obj->q1);
    
    else
    
        return QueueBack(&obj->q2);
    

(5)判断栈是否为空

/** Returns whether the stack is empty. */
bool myStackEmpty(MyStack* obj) 

    return QueueEmpty(&obj->q1)&&QueueEmpty(&obj->q2);


(6)销毁栈

void myStackFree(MyStack* obj) 

    QueueDestroy(&obj->q1);
    QueueDestroy(&obj->q2);
    free(obj);

二、栈实现队列

1.实现思路

假设需要用队列存储1,2,3,4,则出队列顺序是1,2,3,4.我们采用两个栈来实现,刚开始两个栈都是空的,先将元素存入到一个栈中。

再将栈中元素以4,3,2,1的顺序出栈全部一次存入另一个栈中,此时再将栈中元素依次出栈就是,1,2,3,4.

2.实现代码

以下为队列实现栈做铺垫,先完成栈的实现
具体解释可以参考上一篇文章“栈和队列”

(1)创建一个栈实现的队列

因为我们需要两个栈来完成栈的实现

typedef struct 

    Stack pushST;
    Stack popST;
 MyQueue;
/** Initialize your data structure here. */

MyQueue* myQueueCreate() 

    MyQueue* q=(MyQueue*)malloc(sizeof(MyQueue));
    StackInit(&q->pushST);
    StackInit(&q->popST);
    return q;

(2)入栈一个元素

/** Push element x to the back of queue. */
void myQueuePush(MyQueue* obj, int x) 

    StackPush(&obj->pushST,x);

(3)取队头元素

/** Get the front element. */
int myQueuePeek(MyQueue* obj) 

    if(StackEmpty(&obj->popST))
    
        while(!StackEmpty(&obj->pushST))
        
            StackPush(&obj->popST,StackTop(&obj->pushST));
            StackPop(&obj->pushST)
    
    return StackTop(&obj->popST);

(4)删除队头元素并返回

/** Removes the element from in front of queue and returns that element. */
int myQueuePop(MyQueue* obj) 

    int top=myQueuePeek(&obj);
    StackPop(&obj->popST);
    return top;

(5)判断队列是否为空

/** Returns whether the queue is empty. */
bool myQueueEmpty(MyQueue* obj) 

    return StackEmpty(&obj->pushST)&&StackEmpty(&obj->popST);

(6)销毁队列

void myQueueFree(MyQueue* obj) 

    StackDestroy(&obj->pushST);
    StackDestroy(&obj->popST);
    free(obj);

以上是关于栈是不是栈,队列也不是队列---队列实现栈,栈实现队列的主要内容,如果未能解决你的问题,请参考以下文章

队列4:栈实现队列和队列实现栈

php 实现栈与队列

用两个栈实现队列

Java之用栈实现队列

用栈实现队列,用队列实现栈,最小栈,设计循环队列的Java做法

剑指offer06-用两个栈实现一个队列