当前位置:   article > 正文

C语言用栈实现队列_用栈实现队列c语言

用栈实现队列c语言

 

目录

前言

 栈的结构

栈的基本操作

队列的结构

队列的初始化

循环出栈

入队

出队

返回队头

判断队列是否为空

销毁队列


前言

    栈的特点是后进先出,而队列的特点是先进先出,如果要用栈实现队列的特点,这里可以用两个栈来实现,一个栈用于做入栈操作,另一个做出栈操作,在两个栈的配合下可以实现队列。

例如以下两个栈

 要想实现队列的特点,就得让1先出来,但单个栈只会先让4出来,所以我们再定义一个栈让栈1的元素一个一个移动到栈2,再让栈2的元素出栈即可完成先进先出的操作。

 栈的结构

    用于实现队列的两个栈的结构,没有什么特别的要求

  1. typedef struct {
  2. int *stk;
  3. int size;
  4. int capacity;
  5. }MyStack;

栈的基本操作

    栈的创建初始化,入栈,出栈,判断栈是否为空等

  1. //创建栈
  2. MyStack* StackCreat(int capacity){
  3. MyStack *ret=malloc(sizeof(MyStack));
  4. ret->stk=malloc(sizeof(int)*capacity);
  5. ret->size=0;
  6. ret->capacity=capacity;
  7. return ret;
  8. }
  9. //入栈
  10. void StackPush(MyStack* obj,int x){
  11. obj->stk[obj->size++]=x;
  12. }
  13. //出栈
  14. void StackPop(MyStack* obj){
  15. obj->size--;
  16. }
  17. //栈顶
  18. int StackTop(MyStack* obj){
  19. return obj->stk[obj->size-1];
  20. }
  21. //判断栈空
  22. int Stackempty(MyStack* obj){
  23. return obj->size==0;
  24. }
  25. //销毁栈
  26. void StackFree(MyStack* obj){
  27. free(obj->stk);
  28. }

队列的结构

    队列包含两个栈

  1. typedef struct {
  2. MyStack *Instack;
  3. MyStack *Outstack;
  4. } MyQueue;

队列的初始化

  1. MyQueue* myQueueCreate() {
  2. MyQueue *ret=malloc(sizeof(MyStack));
  3. ret->Instack=StackCreat(100);//这里每个栈容量为100
  4. ret->Outstack=StackCreat(100);
  5. return ret;
  6. }

循环出栈

    我们需要一个循环出栈的操作,将栈1的元素全部搬移到栈2

  1. //循环出栈
  2. void in_out(MyQueue* ret){
  3. while(!Stackempty(ret->Instack)){
  4. StackPush(ret->Outstack,StackTop(ret->Instack));
  5. StackPop(ret->Instack);
  6. }
  7. }

入队

入队只需要做入栈操作即可

  1. void myQueuePush(MyQueue* obj, int x) {
  2. StackPush(obj->Instack,x);
  3. }

出队

    将栈1的元素搬移到栈2的操作需要有一个前提:栈2为空。如果栈2不为空则需要先把栈2的所有元素全部出栈后才能进行搬移操作

  1. int myQueuePop(MyQueue* obj) {//出队
  2. if(Stackempty(obj->Outstack)){
  3. in_out(obj);
  4. }
  5. int a=StackTop(obj->Outstack);
  6. //StackPop(obj->Outstack);
  7. obj->Outstack->size--;
  8. return a;
  9. }

返回队头

    也就是栈2的栈顶元素

  1. int myQueuePeek(MyQueue* obj) {//返回队头
  2. if(Stackempty(obj->Outstack)){
  3. in_out(obj);
  4. }
  5. return StackTop(obj->Outstack);
  6. }

判断队列是否为空

  1. bool myQueueEmpty(MyQueue* obj) {
  2. if(Stackempty(obj->Instack) && Stackempty(obj->Outstack))
  3. return true;
  4. return false;
  5. }

销毁队列

  1. void myQueueFree(MyQueue* obj) {
  2. StackFree(obj->Instack);
  3. StackFree(obj->Outstack);
  4. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/598460
推荐阅读
相关标签
  

闽ICP备14008679号