设为首页 加入收藏

TOP

利用栈实现队列(C语言实现)(一)
2014-07-19 22:53:07 来源: 作者: 【 】 浏览:190
Tags:利用 实现 队列 语言

  这里主要实现的是:利用栈来实现队列

  基本思路:

  1,创建两个栈

  2,两个栈合并起来组装成一个队列,分别取名为instack,outstack,用于进队列,出队列

  3,比如有1,2,3,4,5 需要进入队列,先将这一串数压入instack栈中,假设压入顺序为1,2,3,4,5(1为栈底),再将instack中的数据移入outstack中,出栈顺序为:5,4,3,2,1. 那么入outsatck的时候,进栈的顺序同样为 : 5,4,3,2,1(5为栈底),那么出outstack的时候,顺序即为:1,2,3,4,5 这样就做到了入是1,2,3,4,5 出也是1,2,3,4,5 这样就跟队列是一样一样的了。

  代码实现思路:

   实现思路

   准备两个栈用于实现队列:inStack和outStack

   当有新元素入队时: :将其压入 将其压入inStack中

   当需要出队时:

  当outStack为空时:

  1. 将inStack中的元素逐一弹出并压入outStack中

  2. 将outStack的栈顶元素弹出

  当outStack不为空时:

  – 直接将outStack的栈顶元素弹出

  源代码入下:

  这里用到了栈的代码,具体可以参阅:栈的实现与操作(C语言实现)

  头文件:

  #ifndef _SPQueue_H_

  #define _SPQueue_H_

  typedef void SPQueue;

  SPQueue* SPQueue_Create();

  void SPQueue_Destroy(SPQueue* queue);

  void SPQueue_Clear(SPQueue* queue);

  int SPQueue_Append(SPQueue* queue, void* item);

  void* SPQueue_Retrieve(SPQueue* queue);

  void* SPQueue_Header(SPQueue* queue);

  int SPQueue_Length(SPQueue* queue);

  #endif

  源文件:

  // 栈实现队列。cpp : 定义控制台应用程序的入口点。

  //

  #include "stdafx.h"

  #include "SPQueue.h"

  #include "LinkStack.h"

  #include <MALLOC.H>

  #include <STDLIB.H>

  typedef struct

  {

  LinkStack * instack;

  LinkStack * outstack;

  } TSPQueue;

  int _tmain(int argc, _TCHAR* argv[])

  {

  SPQueue* queue = SPQueue_Create();

  int a = {0};

  int i = 0;

  for(i=0; i<10; i++)

  {

  a[i] = i + 1;

  SPQueue_Append(queue, a + i);

  }

  printf("第一次进队列:");

  printf("Header: %d\n", *(int*)SPQueue_Header(queue));

  printf("Length: %d\n", SPQueue_Length(queue));

  for(i=0; i<5; i++)

  {

  printf("%d\t出队列了\n", *(int*)SPQueue_Retrieve(queue));

  }

  printf("\n第二次进队列:\n");

  printf("Header: %d\n", *(int*)SPQueue_Header(queue));

  printf("Length: %d\n", SPQueue_Length(queue));

  for(i=0; i<10; i++) //继续尾加10个节点

  {

  a[i] = i + 1;

  SPQueue_Append(queue, a + i);

  }

  while( SPQueue_Length(queue) > 0 )

  {

  printf("%d\t出队列了\n", *(int*)SPQueue_Retrieve(queue));

  }

  SPQueue_Destroy(queue);

  system("pause");

  return 0;

  }

  //创建

  SPQueue* SPQueue_Create()

  {

  TSPQueue* ret = (TSPQueue*)malloc(sizeof(TSPQueue));

  if (NULL != ret)

  {

  ret->instack = LinkStack_Create();

  ret->outstack = LinkStack_Create();

  if ((NULL == ret->instack) && (NULL == ret->outstack))

  {

  LinkStack_Destroy(ret->instack);

  LinkStack_Destroy(ret->outstack);

  free(ret);

  ret = NULL;

  }

  }

  return ret;

  }

  //销毁

  void SPQueue_Destroy(SPQueue* queue)

  {

  SPQueue_Clear(queue);

  free(queue);

  }

  //清空

  void SPQueue_Clear(SPQueue* queue)

  {

  TSPQueue* SPQueue = (TSPQueue*)queue;

  if (NULL != SPQueue)

  {

  LinkStack_Clear(SPQueue->instack);

  LinkStack_Clear(SPQueue->outstack);

  }

  }

   

首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇程序的栈区(stack)堆区(heap) 下一篇浅谈常量指针与指针常量

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·CPython是什么?PyPy (2025-12-26 06:50:09)
·Python|如何安装seab (2025-12-26 06:50:06)
·python要学习数据分 (2025-12-26 06:50:03)
·每日一道面试题-多线 (2025-12-26 06:20:17)
·java项目中哪些地方 (2025-12-26 06:20:14)