• 两个队列实现一个栈


    全部代码

      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #include <assert.h>
      4 
      5 typedef struct node
      6 {
      7     int nValue;
      8     struct node *pNext;
      9 }MyQueue;
     10 
     11 typedef struct node2
     12 {
     13     int nCount;
     14     MyQueue *pHead;
     15     MyQueue *pTail;
     16 }Queue;
     17 
     18 void q_Init(Queue **ppQueue)
     19 {
     20     assert(ppQueue!=NULL);
     21 
     22     *ppQueue = (Queue *)malloc(sizeof(Queue));
     23     if(NULL == *ppQueue)
     24     {
     25         printf("*ppQueue分配空间失败!
    ");
     26         exit(-1);
     27     }
     28     (*ppQueue)->nCount = 0;
     29     (*ppQueue)->pHead = NULL;
     30     (*ppQueue)->pTail = NULL;
     31 }
     32 
     33 //尾添加
     34 void q_Push(Queue *pQueue, int nNum)
     35 {
     36     MyQueue *pTemp = NULL;
     37 
     38     //队列存在
     39     assert(pQueue!=NULL);
     40 
     41     pTemp = (MyQueue *)malloc(sizeof(MyQueue));
     42     if(NULL == pTemp)
     43     {
     44         printf("pTemp空间分配失败!
    ");
     45         exit(-1);
     46     }
     47     pTemp->nValue = nNum;
     48     pTemp->pNext = NULL;
     49 
     50     //队列空
     51     if(NULL == pQueue->pHead)
     52     {
     53         pQueue->pHead = pTemp;
     54     }
     55     else
     56     {
     57         pQueue->pTail->pNext = pTemp;
     58     }
     59     pQueue->pTail = pTemp;
     60 
     61     //更新队列元素
     62     ++pQueue->nCount;
     63 }
     64 
     65 //头删除
     66 int q_Pop(Queue *pQueue)
     67 {
     68     int nNum;
     69     MyQueue *pDel = NULL;
     70 
     71     //队列存在且队列非空
     72     assert(pQueue!=NULL && pQueue->pHead!=NULL);
     73 
     74     pDel = pQueue->pHead;
     75     nNum = pDel->nValue;
     76     pQueue->pHead = pQueue->pHead->pNext;
     77     free(pDel);
     78     pDel = NULL;
     79 
     80     //更新队列元素
     81     --pQueue->nCount;
     82 
     83     //队列在元素删除后为空 尾置空
     84     if(0 == pQueue->nCount)
     85     {
     86         pQueue->pTail = NULL;
     87     }
     88 
     89     return nNum;
     90 }
     91 
     92 int q_IsEmpty(Queue *pQueue)
     93 {
     94     //队列存在
     95     assert(pQueue!=NULL);
     96 
     97     return 0==pQueue->nCount?1 : 0;
     98 }
     99 
    100 typedef struct node3
    101 {
    102     int nCount;
    103     Queue *pQueue1;
    104     Queue *pQueue2;
    105 }Stack;
    106 
    107 void s_Init(Stack **ppStack)
    108 {
    109     assert(ppStack!=NULL);
    110 
    111     *ppStack = (Stack *)malloc(sizeof(Stack));
    112     if(NULL == *ppStack)
    113     {
    114         printf("*ppStack空间分配失败!
    ");
    115         exit(-1);
    116     }
    117     (*ppStack)->nCount = 0;
    118     (*ppStack)->pQueue1 = NULL;
    119     (*ppStack)->pQueue2 = NULL;
    120 
    121     //申请两个队列
    122     q_Init(&(*ppStack)->pQueue1);
    123     q_Init(&(*ppStack)->pQueue2);
    124 }
    125 
    126 void s_Push(Stack *pStack, int nNum)
    127 {
    128     //栈存在
    129     assert(pStack!=NULL && pStack->pQueue1!=NULL && pStack->pQueue2!=NULL);
    130 
    131     if(!q_IsEmpty(pStack->pQueue1))
    132     {
    133         q_Push(pStack->pQueue1, nNum);
    134     }
    135     else
    136     {
    137         q_Push(pStack->pQueue2, nNum);
    138     }
    139 
    140     //更新栈内元素
    141     ++pStack->nCount;
    142 }
    143 
    144 int s_Pop(Stack *pStack)
    145 {
    146     int nNum;
    147 
    148     //栈存在且栈非空
    149     assert(pStack!=NULL && pStack->nCount!=0 && pStack->pQueue1!=NULL && pStack->pQueue2!=NULL);
    150 
    151     if(!q_IsEmpty(pStack->pQueue1))
    152     {
    153         while(pStack->pQueue1->nCount > 1)
    154         {
    155             q_Push(pStack->pQueue2, q_Pop(pStack->pQueue1));
    156         }
    157         nNum = q_Pop(pStack->pQueue1);
    158     }
    159     else
    160     {
    161         while(pStack->pQueue2->nCount > 1)
    162         {
    163             q_Push(pStack->pQueue1, q_Pop(pStack->pQueue2));
    164         }
    165         nNum = q_Pop(pStack->pQueue2);
    166     }
    167 
    168     //更新栈内元素
    169     --pStack->nCount;
    170 
    171     return nNum;
    172 }
    173 
    174 int main(void)
    175 {
    176     Stack *pStack = NULL;
    177 
    178     s_Init(&pStack);
    179     //添加
    180     s_Push(pStack, 1);
    181     s_Push(pStack, 2);
    182     s_Push(pStack, 3);
    183     s_Push(pStack, 4);
    184     //弹出
    185     printf("%d ", s_Pop(pStack));
    186     printf("%d ", s_Pop(pStack));
    187     printf("%d ", s_Pop(pStack));
    188     printf("%d ", s_Pop(pStack));
    189 
    190     return 0;
    191 }
  • 相关阅读:
    PHP中Foreach在引用时的陷阱 j神
    Yii中Session和cookie的用法 j神
    如何解决web大流量、高并发的问题 j神
    PHP无限级分类的递归算法 j神
    关于breadcrumbs j神
    MySQL索引分析和优化 j神
    Yii笔记 j神
    YII中的URL Management j神
    forward与redirect的区别 j神
    网络编程学习笔记
  • 原文地址:https://www.cnblogs.com/chen-cai/p/7856653.html
Copyright © 2020-2023  润新知