Chinaunix首页 | 论坛 | 博客
  • 博客访问: 803105
  • 博文数量: 274
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 862
  • 用 户 组: 普通用户
  • 注册时间: 2015-10-24 15:31
个人简介

不合格的程序猿

文章分类

全部博文(274)

文章存档

2019年(3)

2018年(1)

2017年(4)

2016年(160)

2015年(106)

我的朋友

分类: C/C++

2016-04-06 17:20:45

要求:
    有两个栈A和B,实现队列C。
实现思想:
    向队列C中压入数据等同于向栈A压栈,从队列C中弹出数据等同于从栈B中弹出数据。

    向A压栈时,判断A是否满栈以及B是否为空栈。如果A满B空,则将A中的所有数据弹出后压入B中,然后再向A压入数据;如果A满B非空,则不能像A中压入数据。
    从B弹栈时,判断A和B是否都为空,如果是,则队列为空;否则,判断B是否为空,若B非空,则从B弹栈;若B为空,则将A中的所有数据弹出后压入B中,然后从B弹栈;

PS: 不少函数使用的是void类型,没关注其返回值,可根据需要加入异常处理。多线程对队列C做写操作时,需要加锁。

// stack.c

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include "stack.h"

  5. static void stack_AddHead(STACK_HEAD_S *pstHead, STACK_NODE_S *pstAddNode)
  6. {
  7.     pstAddNode->pstNext = pstHead->pstNext;
  8.     pstHead->pstNext = pstAddNode;

  9.     return;
  10. }

  11. /* 压栈 */
  12. void stack_push(STACK_HEAD_S *pstHead, int iData)
  13. {
  14.     STACK_NODE_S *pstNode;

  15.     if (NULL == pstHead || pstHead->iStackDeep > STACK_DEEP_MAX)
  16.     {
  17.         return;
  18.     }

  19.     pstNode = (STACK_NODE_S *)malloc(sizeof(STACK_NODE_S));
  20.     if (NULL != pstNode)
  21.     {
  22.         memset(pstNode, 0, sizeof(*pstNode));
  23.         pstNode->iData = iData;
  24.         stack_AddHead(pstHead, pstNode);
  25.         pstHead->iStackDeep++;
  26.     }
  27.     
  28.     return;
  29. }

  30. /* 弹栈 */
  31. int stack_popd(STACK_HEAD_S *pstHead)
  32. {
  33.     STACK_NODE_S *pstNode;
  34.     int iData;

  35.     if (NULL == pstHead || NULL == pstHead->pstNext)
  36.     {
  37.         return;
  38.     }

  39.     pstNode = pstHead->pstNext;
  40.     pstHead->pstNext = pstHead->pstNext->pstNext;
  41.     iData = pstNode->iData;
  42.     free(pstNode);
  43.     pstHead->iStackDeep--;
  44.     
  45.     return iData;
  46. }

  47. /* 获取栈深度 */
  48. int stack_deep(STACK_HEAD_S *pstHead)
  49. {
  50.     int iStackDeep = -1;
  51.     
  52.     if (NULL != pstHead)
  53.     {
  54.         iStackDeep = pstHead->iStackDeep;
  55.     }
  56.     
  57.     return iStackDeep;
  58. }

  59. int stack_empty(STACK_HEAD_S *pstHead)
  60. {
  61.     int iIsStackEmpty = 0;

  62.     if (NULL == pstHead || 0 == pstHead->iStackDeep)
  63.     {
  64.         iIsStackEmpty = 1;
  65.     }

  66.     return iIsStackEmpty;
  67. }

  68. int stack_full(STACK_HEAD_S *pstHead)
  69. {
  70.     int iIsStackFull = 0;

  71.     if (NULL != pstHead && STACK_DEEP_MAX == pstHead->iStackDeep)
  72.     {
  73.         iIsStackFull = 1;
  74.     }

  75.     return iIsStackFull;
  76. }
// stack.h

点击(此处)折叠或打开

  1. #ifndef __STACK_H__
  2. #define __STACK_H__

  3. #define STACK_DEEP_MAX 256U

  4. typedef struct tagStackNode{
  5.     struct tagStackNode *pstNext;
  6.     int iData;
  7. } STACK_NODE_S;

  8. typedef struct tagStackHead{
  9.     STACK_NODE_S *pstNext;
  10.     int iStackDeep;
  11. } STACK_HEAD_S;


  12. void stack_push(STACK_HEAD_S *pstHead, int iData);
  13. int stack_popd(STACK_HEAD_S *pstHead);
  14. int stack_deep(STACK_HEAD_S *pstHead);
  15. int stack_empty(STACK_HEAD_S *pstHead);
  16. int stack_full(STACK_HEAD_S *pstHead);

  17. #endif

// queue_by_stack.c

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include "stack.h"

  5. STACK_HEAD_S g_stHeadA;
  6. STACK_HEAD_S g_stHeadB;

  7. static int queue_IsAbleToPush(void)
  8. {
  9.     int iIsStackFull;
  10.     int iIsStackEmpty;
  11.     int iIsAble = 1;

  12.     iIsStackFull = stack_full(&g_stHeadA);
  13.     iIsStackEmpty = stack_empty(&g_stHeadB);
  14.     if (1 == iIsStackFull && 0 == iIsStackEmpty)
  15.     {
  16.         iIsAble = 0;
  17.     }

  18.     return iIsAble;
  19. }

  20. int queue_empty(void)
  21. {
  22.     int iIsStackEmpty;

  23.     iIsStackEmpty = stack_empty(&g_stHeadA);
  24.     iIsStackEmpty &= stack_empty(&g_stHeadB);
  25.     
  26.     return iIsStackEmpty;
  27. }

  28. static void queue_PushStackAToStackB(void)
  29. {
  30.     int iStackDeep, iLoop, iData;

  31.     iStackDeep = stack_deep(&g_stHeadA);
  32.     for (iLoop = 0; iLoop < iStackDeep; iLoop++)
  33.     {
  34.         iData = stack_popd(&g_stHeadA);
  35.         stack_push(&g_stHeadB, iData);
  36.     }

  37.     return;
  38. }

  39. void queue_push(int iData)
  40. {
  41.     int iIsAble;
  42.     int iIsStackFull;

  43.     iIsAble = queue_IsAbleToPush();
  44.     if (0 == iIsAble)
  45.     {
  46.         return;
  47.     }

  48.     iIsStackFull = stack_full(&g_stHeadA);
  49.     if (1 == iIsStackFull)
  50.     {
  51.         queue_PushStackAToStackB();        
  52.     }
  53.     stack_push(&g_stHeadA, iData);

  54.     return;
  55. }

  56. int queue_popd(void)
  57. {
  58.     int iIsQueueEmpty;
  59.     int iIsStackEmpty;
  60.     int iData;

  61.     iIsQueueEmpty = queue_empty();
  62.     if (1 == iIsQueueEmpty)
  63.     {
  64.         return -1;
  65.     }

  66.     iIsStackEmpty = stack_empty(&g_stHeadB);
  67.     if (0 == iIsStackEmpty)
  68.     {
  69.         iData = stack_popd(&g_stHeadB);
  70.     }
  71.     else
  72.     {
  73.         queue_PushStackAToStackB();
  74.         iData = stack_popd(&g_stHeadB);
  75.     }

  76.     return iData;
  77. }

  78. int queue_length(void)
  79. {
  80.     int iIsQueueEmpty;
  81.     int iLength = -1;

  82.     iIsQueueEmpty = queue_empty();
  83.     if (0 == iIsQueueEmpty)
  84.     {
  85.         iLength = stack_deep(&g_stHeadB);
  86.         iLength += stack_deep(&g_stHeadA);
  87.     }

  88.     return iLength;
  89. }

  90. void queue_test(void)
  91. {
  92.     int iLoop, iQueueLen, iData;
  93.     int iFlag = 0;

  94.     for (iLoop = 0; iLoop < 2 * STACK_DEEP_MAX; iLoop++)
  95.     {
  96.         queue_push(iLoop);
  97.     }

  98.     iQueueLen = queue_length();
  99.     for (iLoop = 0; iLoop < iQueueLen; iLoop++)
  100.     {
  101.         iData = queue_popd();
  102.         printf("%d\t", iData);
  103.         iFlag++;
  104.         if (0 == iFlag % 8)
  105.         {
  106.             printf("\n");
  107.         }
  108.     }
  109.     printf("\n");

  110.     return;
  111. }

  112. void main(void)
  113. {
  114.     queue_test();

  115.     return;
  116. }


阅读(1138) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~