两个栈实现一个队列

  基本思想:栈1用来添加(直接添加即可),栈2用来删除(先判断栈2是否是空,如果是空,把栈1的元素弹出,添加到栈2中,然后弹出栈2的栈顶元素,作为出队的元素;如果栈2非空,直接弹出栈2的栈顶元素,作为出队的元素即可)。

全部代码

 

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

typedef struct node
{
    int nValue;
    struct node *pNext;
}MyStack;

typedef struct node2
{
    int nCount;
    MyStack *pTop;
}Stack;

void s_Init(Stack **ppStack)
{
    assert(ppStack!=NULL);

    *ppStack = (Stack *)malloc(sizeof(Stack));
    if(NULL == *ppStack)
    {
        printf("*ppStack空间分配失败!\n");
        exit(-1);
    }
    (*ppStack)->nCount = 0;
    (*ppStack)->pTop = NULL;
}

void s_Push(Stack *pStack, int nNum)
{
    MyStack *pTemp = NULL;

    //栈存在
    assert(pStack!=NULL);

    //临时节点申请空间
    pTemp = (MyStack *)malloc(sizeof(MyStack));
    if(NULL == pTemp)
    {
        printf("pTemp空间分配失败!\n");
        exit(-1);
    }
    pTemp->nValue = nNum;
    pTemp->pNext = NULL;

    //头添加
    //临时节点的下一个是头节点
    pTemp->pNext = pStack->pTop;
    //新节点是新栈顶
    pStack->pTop = pTemp;

    //更新栈内元素
    ++pStack->nCount;
}

int s_Pop(Stack *pStack)
{
    int nNum;
    MyStack *pDel = NULL;

    assert(pStack!=NULL && pStack->pTop!=NULL);

    //标记  要删除的节点
    pDel = pStack->pTop;
    nNum = pStack->pTop->nValue;
    //栈顶指针下移
    pStack->pTop = pStack->pTop->pNext;
    //释放空间
    free(pDel);
    pDel = NULL;

    //更新栈内元素
    --pStack->nCount;

    return nNum;
}

int s_IsEmpty(Stack *pStack)
{
    assert(pStack!=NULL);

    return 0==pStack->nCount ? 1:0;
}

typedef struct node3
{
    int nCount;
    Stack *pStack1;
    Stack *pStack2;
}Queue;

void q_Init(Queue **ppQueue)
{
    assert(ppQueue!=NULL);

    *ppQueue = (Queue *)malloc(sizeof(Queue));
    if(NULL == *ppQueue)
    {
        printf("*ppQueue分配空间失败!\n");
        exit(-1);
    }
    (*ppQueue)->nCount = 0;
    (*ppQueue)->pStack1 = NULL;
    (*ppQueue)->pStack2 = NULL;

    //申请辅助栈
    s_Init(&(*ppQueue)->pStack1);
    s_Init(&(*ppQueue)->pStack2);
}

void q_Push(Queue *pQueue, int nNum)
{
    //队列存在
    assert(pQueue!=NULL && pQueue->pStack1!=NULL && pQueue->pStack2!=NULL);

    s_Push(pQueue->pStack1, nNum);

    //更新队列元素
    ++pQueue->nCount;
}

int q_Pop(Queue *pQueue)
{
    int nNum;

    //队列存在且队列非空
    assert(pQueue!=NULL && pQueue->nCount!=0 && pQueue->pStack1!=NULL && pQueue->pStack2!=NULL);

    if(!s_IsEmpty(pQueue->pStack2))
    {
        nNum = s_Pop(pQueue->pStack2);
    }
    else
    {
        while(pQueue->pStack1->nCount > 0)
        {
            s_Push(pQueue->pStack2, s_Pop(pQueue->pStack1));
        }
        nNum = s_Pop(pQueue->pStack2);
    }

    //更新队列元素
    --pQueue->nCount;

    return nNum;
}

int main(void)
{
    Queue *pQueue = NULL;

    //初始化
    q_Init(&pQueue);

    //添加
    q_Push(pQueue, 1);
    q_Push(pQueue, 2);
    q_Push(pQueue, 3);
    q_Push(pQueue, 4);

    //弹出
    printf("%d ", q_Pop(pQueue));
    printf("%d ", q_Pop(pQueue));
    printf("%d ", q_Pop(pQueue));
    printf("%d ", q_Pop(pQueue));

    return 0;
}

 

posted @ 2017-11-18 15:14  c&z  阅读(285)  评论(0编辑  收藏  举报