两个队列实现一个栈


核心思想:模拟出栈的后进先出操作
创建queue1和queue2,入栈时选择一个非空队列执行入队列操作(若两个队列都为空,则随机选择一个队列),出栈时需要先从非空队列queue1把数依次进入空数列queue2,直到queue1中到最后一个数为止,然后将queue1中的数出队列,模拟出栈的后进先出操作。

代码模拟
Stackby_two_queue.h

#pragma oncetypedef char DataType2;typedef struct Queue
{DataType2* queue_data;int head;int tail;int size;int capacity;
}Queue;typedef struct Stack
{Queue queue1;Queue queue2;//栈中有效元素个数int size;
}Stack;//栈的初始化
void StackInit(Stack *stack,int vector_capacity);
//栈的销毁
void StackDestory(Stack* stack);
//入栈
void StackPush(Stack* stack, DataType2 value);
//出栈
void StackPop(Stack* stack);
//取栈顶元素
DataType2 StackGetTop(Stack* stack);

Stackby_two_queue.c

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include "Stackby_two_queue.h"void QueueInit(Queue* queue, int vector_capacity)
{if (queue == NULL){assert(0);return -1;}queue->capacity = vector_capacity;queue->queue_data = (DataType2*)malloc(sizeof(DataType2)*queue->capacity);queue->size = 0;queue->head = 0;queue->tail = 0;
}void QueueDestory(Queue* queue)
{if (queue == NULL){assert(0);return -1;}free(queue->queue_data);queue->queue_data = NULL;queue->size = 0;queue->head = 0;queue->tail = 0;queue->capacity = 0;
}void QueuePush(Queue* queue,DataType2 value)
{if (queue == NULL){assert(0);return -1;}if (queue->size >= queue->capacity){return ;}queue->queue_data[queue->tail++] = value;queue->size++;if (queue->tail > queue->capacity){queue->tail = 0;}
}void QueuePop(Queue* queue)
{if (queue == NULL){assert(0);return -1;}if (queue->size == 0){return ; }if (queue->head >= queue->capacity){queue->head = 0;}queue->head++;queue->size--;if (queue->size == 0){queue->head = 0;queue->tail = 0;}
}
//取队首元素
DataType2 QueueGetTop(Queue* queue)
{if (queue == NULL){assert(0);return -1;}if (queue->size == 0){return ;}return queue->queue_data[queue->head];
}//打印整个队列
void PrintQueue(Queue* queue)
{if (queue == NULL){assert(0);return -1;}if (queue->size == 0){return ; }if (queue->head < queue->tail){int i = queue->head;for (; i < queue->tail; i++){printf("%c ", queue->queue_data[i]);}}else{int i = queue->head;while (queue->head < queue->capacity){printf("%c", queue->queue_data[queue->head]);queue->head++;}queue->head = 0;for (i = queue->head; i < queue->tail; ++i){printf("%c ", queue->queue_data[i]);}}printf("\n");
}//通过两个队列实现一个栈的入栈,出栈和取栈顶元素操作
//栈的初始化函数
void StackInit(Stack* stack,int vector_capacity)
{if (stack == NULL){assert(0);return -1;}QueueInit(&stack->queue1,vector_capacity);QueueInit(&stack->queue2,vector_capacity);stack->size = 0;
}//销毁一个栈
void StackDestory(Stack* stack)
{if (stack == NULL){assert(0);return -1;}QueueDestory(&stack->queue1);QueueDestory(&stack->queue2);stack->size = 0;
}//入栈操作
void StackPush(Stack* stack,DataType2 value)
{if (stack == NULL){assert(0);return -1;}if (stack->queue1.size != 0) {QueuePush(&stack->queue1, value);}else {QueuePush(&stack->queue2, value);}stack->size++;
}void StackPop(Stack* stack)
{if (stack == NULL){assert(0);return -1;}if (stack->queue1.size == 0 && stack->queue2.size == 0){return ;}Queue* from = NULL;Queue* to = NULL;//判断数据放在了哪个队列if (stack->queue1.size != 0){from = &stack->queue1;to = &stack->queue2;}else{from = &stack->queue2;to = &stack->queue1;}while (from->size > 1){//取到from队列的队头元素DataType2 tmp = QueueGetTop(from);//from做一次出队列操作QueuePop(from);//将from的对头放到to队列QueuePush(to, tmp);}//把from队列剩的最后一个元素移出队列,模拟出栈QueuePop(from);//栈中的有效数据个数减一stack->size--;
}DataType2 StackGetTop(Stack* stack)
{if (stack == NULL){assert(0);return -1;}if ((stack->queue1.size == 0) && (stack->queue2.size == 0)){return ;}Queue* from = NULL;Queue* to = NULL;//判断数据放在了哪个队列if (stack->queue1.size != 0){from = &stack->queue1;to = &stack->queue2;}else{from = &stack->queue2;to = &stack->queue1;}while (from->size > 1){//取到from队列的队头元素DataType2 tmp = QueueGetTop(from);//from做一次出队列操作QueuePop(from);//将from的对头放到to队列QueuePush(to, tmp);}//读取from队列的最后一个元素,模拟读取栈顶DataType2 stacktop = QueueGetTop(from);QueuePop(from);QueuePush(to, stacktop);return stacktop;
}void PrintStack(Stack* stack)
{if (stack == NULL){assert(0);return -1;}if (stack->size == 0){return ;}Queue* print = NULL;if (stack->queue1.size == 0){print = &stack->queue2;}else{print = &stack->queue1;}PrintQueue(print);
}int main()
{Stack stack;//初始化StackInit(&stack,10);//入栈函数测试StackPush(&stack, 'a');StackPush(&stack, 'b');StackPush(&stack, 'c');StackPush(&stack, 'd');StackPop(&stack);PrintStack(&stack);DataType2 top_value = StackGetTop(&stack);printf("%c \n", top_value);StackDestory(&stack);system("pause");return 0;
}

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

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

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

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

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

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

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

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

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

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

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

  6. 数据结构:栈和列之如何用两个队列实现一个栈?两个栈实现一个队列?

    1.栈和队列分析 栈是一种特殊的线性表.其特殊性在于限定插入和删除数据元素的操作只能在线性表的一端进行 队列(Queue)也是一种运算受限的线性表,它的运算限制与栈不同,是两头都有限制,插入只能在表的 ...

  7. C/C++面试题—使用STL两个队列实现一个栈

    题目介绍 使用STL中的两个队列实现一个栈,实现栈的top.pop.push.clear等操作. 思路分析 思路和使用2个栈实现一个队列是相通的,用一个队列queue1容器用来 压栈,出栈的时候判断q ...

  8. java 栈和队列实现迷宫代码_使用两个队列实现一个栈

    两个队列实现一个栈 栈的特点是后进先出,队列的特点是先进先出.使用两个队列模拟栈,实现栈的push,pop,top,empty 操作. 假设队列中均为数字,其中队列q1为操作队列,q2为辅助队列. p ...

  9. 【C++】两个队列实现一个栈

    两个队列实现一个栈的思想:用_PushQ1队列作为push数据的队列,用_TmpQ2队列暂存数据 1.只要是对栈进行push操作,就将数据push入_PushQ1队列中. 2.要实现栈的pop操作,就 ...

最新文章

  1. 买不到回家的票,都是“抢票加速包”惹的祸?
  2. 开源自动机器学习(AutoML)框架盘点
  3. 北京市:通过区块链等技术手段,实现住所申报材料无纸化
  4. ps软件怎么测试性能,怎么样提高Photoshop性能,让PS软件快速启动
  5. 反思耗时任务异步处理
  6. 【阿里妈妈数据科学系列】第三篇:离线抽样框架下的AB Test
  7. 关于stm32启动文件的选择
  8. python华容道最短路径_NOIp2013D2T3 华容道【搜索图论-最短路】
  9. 2G退网 对用户影响几何?
  10. 图片内包含文本制作方法
  11. php防止网站被镜像,网站防止被其他站iframe框架引用镜像的方法
  12. IT行业的发展前景分析
  13. 全球资本市场竞争力指数排名发布,中国跃居第五
  14. Springboot集合POI导出多sheet的Excel表格
  15. 关于Android 4.4(华为)调用系统相机问题
  16. 香侬专栏 | 独家对话斯坦福大学计算机系教授Percy Liang
  17. 课程设计-在校整理-10 基于知识图谱的医疗智能问答小程序实现示例
  18. 《Effective C++》学习笔记(持续更新)
  19. Python恢复初始的pip list(清空所有包)
  20. God.Game 漏洞复盘:跑路还是黑客攻击?

热门文章

  1. 尚硅谷springboot笔记
  2. C++偶遇-菱形继承
  3. dns智能解析对网站排名的影响
  4. 酷睿i7 9750h相当于什么水平 i79750h属于哪个档次
  5. 内向性格的人应该如何选择职业?
  6. 有机无脂牛奶的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  7. 阿里云物联网平台创建产品设备的方法
  8. Windows 8 平板(推荐)
  9. 曾经的付费视频课持续放出,以及【直播预告】
  10. 单声道蓝牙实现音乐播放