两个栈实现一个队列


核心思想:模拟出队列先进先出的数据结构
假设有两个栈input和output,input模拟栈的数据插入,当需要模拟出队列操作时,input栈中的A,B,C,D会按照D,C,B,A的顺序进入栈output。 只要output栈不为空,出队列操作就可以通过output的出栈操作来实现。
若output栈为空,则继续从input栈导入数据。
若两个栈都为空,即整个队列为空。

代码模拟:
Queueby_two_stack.h

#pragma oncetypedef int DataType;typedef struct Stack
{DataType* Data;//有效元素个数int size;//栈的容量个数int capacity;
}Stack;typedef struct Queue
{Stack input;Stack output;//有效元素个数int size;
}Queue;//初始化函数
void QueueInit(Queue *queue);
//销毁函数
void QueueDestory(Queue *queue);
//入栈函数
void QueuePush(Queue *queue, DataType value);
//出栈函数
void QueuePop(Queue *queue);
//取栈顶元素函数
DataType QueueFront(Queue *queue);

Queueby_two_stack.c

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include "Queueby_two_stack.h"void StackInit(Stack* stack,DataType capacity)
{if (stack == NULL){assert(0);return -1;}stack->capacity = capacity;stack->size = 0;stack->Data = (DataType*)malloc(sizeof(DataType)* stack->capacity);
}//栈销毁函数
void StackDestory(Stack* stack)
{if(stack == NULL){assert(0);return -1;}free(stack->Data);stack->Data = NULL;stack->capacity = 0;stack->size = 0;
}//入栈操作
void StackPush(Stack* stack,DataType value)
{if (stack == NULL){assert(0);return -1;}if (StackFull(stack)){int new_capacity = stack->capacity * 2;DataType *newDate = (DataType *)malloc(sizeof(DataType) * new_capacity);if (newDate == NULL){assert(0);}for (int i = 0; i < stack->size; ++i){newDate[i] = stack->Data[i];}stack->Data = newDate;stack->capacity = new_capacity;}else{stack->Data[stack->size + 1] = value;stack->size++;}
}int StackFull(Stack* stack)
{if(stack == NULL){assert(0);return -1;}if (stack->size == stack->capacity){return 1;}else{return 0;}
}int StackEmpty(Stack* stack)
{if (stack == NULL){assert(0);return -1;}if (stack->size == 0){return 1;}else{return 0;}
}//出栈操作
int StackPop(Stack* stack)
{if (stack == NULL){assert(0);return -1;}if(stack->size == 0){return ;}stack->size--;
}//取栈顶元素
DataType StackGetTop(Stack* stack)
{if (stack == NULL){assert(0);return -1;}if (stack->size == 0){return ; }else{return stack->Data[stack->size-1];}
}//队列初始化函数
void QueueInit(Queue* queue,DataType capacity)
{if (queue == NULL){assert(0);}StackInit(&queue->input,capacity);StackInit(&queue->output, capacity);queue->size = 0;
}//队列销毁函数
void QueueDestory(Queue *queue)
{if (queue == NULL){assert(0);}StackDestory(&queue->input);StackDestory(&queue->output);queue->size = 0;
}//入队列函数
void QueuePush(Queue *queue, DataType value)
{if (queue == NULL){assert(0);return -1;}StackPush(&queue->input, value);queue->size++;
}//出队列函数
void QueuePop(Queue* queue)
{if (queue == NULL){assert(0);return -1;}if (StackEmpty(&queue->output)){if (StackEmpty(&queue->input)){return ;}else{int newsize = queue->input.size;for(int i = 0;i< newsize;++i){DataType tmp = StackGetTop(&queue->input);StackPop(&queue->input);StackPush(&queue->output,tmp);}}}StackPop(&queue->output);queue->size--;}//取队首元素函数
DataType QueueFront(Queue* queue)
{if (queue == NULL){assert(0);return -1;}if (StackEmpty(&queue->output)){if (StackEmpty(&queue->input)){return ;}else{int newsize = queue->input.size;for (int i = 0; i <newsize ; ++i){DataType tmp = StackGetTop(&queue->input);StackPop(&queue->input);StackPush(&queue->output, tmp);}}}return StackGetTop(&queue->output);
}
int main()
{Queue queue;QueueInit(&queue,10);//入队列函数测试QueuePush(&queue, 1);QueuePush(&queue, 2);QueuePush(&queue, 3);QueuePush(&queue, 4);QueuePop(&queue);DataType tmp = QueueFront(&queue);printf("%d \n", tmp);system("pause");return 0;
}

【c语言】两个栈实现一个队列相关推荐

  1. 多态指针访问虚函数不能被继承的类快速排序N皇后问题插入排序堆排序merge归并排序栈上生成对象两个栈实现一个队列...

    多态 /*1. 要想实现覆盖(重写)父类必须声明为virtual,子类可以不声明为virtual.-->FunB()2. 派生类重写基类的虚函数实现多态,要求函数名.参数列表.返回值完全相同.( ...

  2. 【剑指offer】用两个栈实现一个队列

    题目:两个栈实现一个队列. 栈的特点:先进后出,队列的特点是先进先出 思路:stack1放入数据:pop时,先判断stack2是否为空,如果不为空,直接pop,如果空,则push(stack1.pop ...

  3. 剑指offer五:两个栈实现一个队列

    题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. package com.jianzhioffer;import java.util.Stack;publ ...

  4. 两个栈实现一个队列,两个队列实现一个栈

    题目:用两个栈实现一个队列,用两个队列实现一个栈. 首先要了解栈和队列这两种数据结构各自的特点,栈是一种后入先出(Last In First Out,LIFO)的数据结构,队列是一种先进先出(Firs ...

  5. python 用两个栈实现一个队列

    | 两个栈实现队列 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能.(若队列中没有元素 ...

  6. java实现-两个栈实现一个队列和两个队列实现一个栈

    1.两个栈实现一个队列 思路:压入元素直接入stack1,删除元素先判断stack2中是否为空,如果不为空直接弹出:为空则将stack1中的元素取出压入 stack2中再弹出. 代码: import ...

  7. python ——两个队列实现一个栈两个栈实现一个队列

    1.两个队列实现一个栈 进栈:元素入队列A 出栈:判断如果队列A只有一个元素,则直接出队.否则,把队A中的元素出队并入队B,直到队A中只有一个元素,再直接出队.为了下一次继续操作,互换队A和队B. p ...

  8. 两个栈实现一个队列与两个队列实现一个栈

    http://blog.csdn.net/z84616995z/article/details/19204529 两个栈实现一个队列: 原理方法:用一个栈为主栈,一个栈为辅助栈存放临时元素. 入队:将 ...

  9. 【数据结构】(面试题)使用两个栈实现一个队列(详细介绍)

    http://blog.csdn.net/hanjing_1995/article/details/51539578 使用两个栈实现一个队列 思路一: 我们设定s1是入栈的,s2是出栈的. 入队列,直 ...

  10. 两个栈实现一个队列/两个队列实现一个栈

    http://blog.csdn.net/sinat_30472685/article/details/70157227 1两个栈实现一个队列 1.原理分析: 队列的主要操作有两个:入队操作和出队操作 ...

最新文章

  1. 接口测试,接口协议以及常用接口测试工具介绍
  2. 揭秘:机器究竟是怎么学习的?
  3. [jQuery]使用jQuery.Validate进行客户端验证(高级篇-下)——不使用微软验证控件的理由...
  4. 开发笔记:掉落系统模块设计思路
  5. JVM解惑:消失的异常堆栈,log中打印异常堆栈为空
  6. 工作195:解决key值不唯一的报错
  7. 求n!中末尾零的个数
  8. 网吧组建及相关技术(无盘技术;VLAN;PacketTrace)
  9. 第12周前端学习周报
  10. 如何提升 Java 技术
  11. 150分钟学会R语言与R常见问题解答
  12. 超级计算机在日常生活中有哪些有趣的应用
  13. InnoDB和MyISAM区别?
  14. PIM-SM--理论详解
  15. android获取用户手机信息,Android – 使用AccountManager /手机所有者的姓氏和姓氏获取用户数据...
  16. 计算机房况控制功能是,从实际出发加强计算机房的管理和维护-文档资料.docx
  17. the kth number第几大数问题
  18. git 远程仓库相关命令
  19. checkbox选中和不选中 jqu_jquery怎么设置checkbox不选中?
  20. 计算机求职自荐信800字大学,计算机专业大学生求职自荐信

热门文章

  1. 掌控安全Web安全微专业笔记
  2. 导航电子地图数据格式概论
  3. Django中的swagger文档
  4. kotlin使用gson解析json
  5. Ubuntu 16.04-codeblocks 汉化
  6. ipsan虚拟存储服务器,IPSAN存储架构
  7. 论文阅读-Generative Image Inpainting with Contextual Attention
  8. Subversion vs Subclipse
  9. cfa三级真题和mock_cfa三级要看哪些书?
  10. 计算机二级题百度云,题库吧百度_计算机二级 office 题库 百度云 谢谢_淘题吧