使用两个栈实现一个队列
题目:使用两个栈实现一个队列。
栈:后进先出。
队列:先进先出。
入队列:
直接入栈1。
出队列:
返回队列的队尾元素:
返回队列的队头元素:
队列为空:
栈1为空&&栈2为空。
队列元素个数:
栈1的元素个数+栈2的元素个数。
参考代码:
设置一个队列由两个栈组成:
typedef struct Queue
{stack s1;stack s2;
}queue;
其中栈:
#define Max 10
#define Datatype int
typedef struct stack
{Datatype data[Max];int top ;
}stack;
队列的初始化:
队列的初始化即两个栈的初始化
void InitQueue(queue *q)
{assert(q);InitStack(&q->s1);InitStack(&q->s2);
}
栈的初始化:
void InitStack(stack *s)
{assert(s);s->top = 0;memset(s->data, 0, Max*sizeof(Datatype));
}
入队列:
直接入栈1
void PushQueue(queue *q, Datatype d)
{assert(q);//入栈1PushStack(&q->s1, d);
}
入栈:
void PushStack(stack *s, Datatype d)
{assert(s);if (s->top >= Max){printf("队列已满!\n");return;}s->data[s->top++] = d;
}
出队列:
栈2不为空即栈2出栈,若栈2为空,将栈1的元素导入栈2,栈2出栈。
void PopQueue(queue *q)
{assert(q);if (EmptyQueue(q)){printf("队列为空!\n");return;}//如果栈2为空,将栈1中的元素移入栈2if (EmptyStack(&q->s2)){while (!EmptyStack(&q->s1)){PushStack(&q->s2, TopStack(&q->s1));PopStack(&q->s1);}}//栈2的栈顶PopStack(&q->s2);
}
出栈:
void PopStack(stack *s)
{assert(s);if (s->top == 0)return;s->top--;
}
返回栈顶元素:
Datatype TopStack(stack *s)
{assert(s);return s->data[s->top - 1];
}
返回队尾元素:
即栈1的栈顶元素,若栈1为空,将栈2的元素移入栈1,栈1栈顶出栈。
//栈1的栈顶
Datatype QueueBack(queue *q)
{assert(q);if (EmptyQueue(q)){printf("队列为空!\n");return -1;}//如果栈1为空,将栈2中的元素移入栈1if (EmptyStack(&q->s1)){while (!EmptyStack(&q->s2)){PushStack(&q->s1, TopStack(&q->s2));PopStack(&q->s2);}}//栈1的栈顶return TopStack(&q->s1);
}
返回队头元素:
即栈2的栈顶元素,若栈2为空,将栈1的元素移入栈2,返回栈2的栈顶。
//栈2的栈顶
Datatype QueueFront(queue *q)
{assert(q);if (EmptyQueue(q)){printf("队列为空!\n");return -1;}//如果栈2为空,将栈2中的元素移入栈1if (EmptyStack(&q->s2)){while (!EmptyStack(&q->s1)){PushStack(&q->s2, TopStack(&q->s1));PopStack(&q->s1);}}//栈2的栈顶return TopStack(&q->s2);
}
判断队列是否为空:
队列为空即两个栈均为空。
//栈1为空&&栈2为空
int EmptyQueue(queue *q)
{assert(q);return EmptyStack(&q->s1) && EmptyStack(&q->s2);
}
栈是否为空:(判断top是否等于0)
int EmptyStack(stack *s)
{assert(s);return 0 == s->top;
}
队列元素个数:
栈1的元素个数加栈2的元素个数。
//栈1元素个数+栈2元素个数
int SizeQueue(queue *q)
{assert(q);return SizeStack(&q->s1) + SizeStack(&q->s2);
}
栈元素的个数:
int SizeStack(stack *s)
{assert(s);return s->top;
}
整体代码:
.h文件
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<string.h>
#define Max 10
#define Datatype int
typedef struct stack
{Datatype data[Max];int top ;
}stack;
typedef struct Queue
{stack s1;stack s2;
}queue;
//初始化对列
void InitQueue(queue *q);
//入对列
void PushQueue(queue *q, Datatype d);
//对列元素个数
int SizeQueue(queue *q);
//对列尾
int QueueBack(queue *q);
//对列尾
int QueueFront(queue *q);
//出对列
void PopQueue(queue *q);
.c文件
#include"TwoStack_Queeue.h"
//1.初始化栈void InitStack(stack *s)
{assert(s);s->top = 0;memset(s->data, 0, Max*sizeof(Datatype));
}
//1.初始化队列
void InitQueue(queue *q)
{assert(q);InitStack(&q->s1);InitStack(&q->s2);
}//入栈1
void PushStack(stack *s, Datatype d)
{assert(s);if (s->top >= Max){printf("队列已满!\n");return;}s->data[s->top++] = d;
}
//入队列(入栈1)
void PushQueue(queue *q, Datatype d)
{assert(q);//入栈1PushStack(&q->s1, d);
}//栈元素个数
int SizeStack(stack *s)
{assert(s);return s->top;
}
//队列元素个数
int SizeQueue(queue *q)
{assert(q);return SizeStack(&q->s1) + SizeStack(&q->s2);
}//栈空
int EmptyStack(stack *s)
{assert(s);return 0 == s->top;
}
//队列空
int EmptyQueue(queue *q)
{assert(q);return EmptyStack(&q->s1) && EmptyStack(&q->s2);
}//出栈void PopStack(stack *s)
{assert(s);if (s->top == 0)return;s->top--;
}
//返回栈顶元素
Datatype TopStack(stack *s)
{assert(s);return s->data[s->top - 1];
}
//出队列
void PopQueue(queue *q)
{assert(q);if (EmptyQueue(q)){printf("队列为空!\n");return;}//如果栈2为空,将栈1中的元素移入栈2if (EmptyStack(&q->s2)){while (!EmptyStack(&q->s1)){PushStack(&q->s2, TopStack(&q->s1));PopStack(&q->s1);}}//栈2的栈顶PopStack(&q->s2);
}//队列尾 栈1的栈顶
Datatype QueueBack(queue *q)
{assert(q);if (EmptyQueue(q)){printf("队列为空!\n");return -1;}//如果栈1为空,将栈2中的元素移入栈1if (EmptyStack(&q->s1)){while (!EmptyStack(&q->s2)){PushStack(&q->s1, TopStack(&q->s2));PopStack(&q->s2);}}//栈1的栈顶return TopStack(&q->s1);
}//队列头 栈2的栈顶
Datatype QueueFront(queue *q)
{assert(q);if (EmptyQueue(q)){printf("队列为空!\n");return -1;}//如果栈1为空,将栈2中的元素移入栈1if (EmptyStack(&q->s2)){while (!EmptyStack(&q->s1)){PushStack(&q->s2, TopStack(&q->s1));PopStack(&q->s1);}}//栈2的栈顶return TopStack(&q->s2);
}
测试文件:
#include"TwoStack_Queeue.h"void Test2StackToQueue()
{queue q;InitQueue(&q);PushQueue(&q, 1);PushQueue(&q, 2);PushQueue(&q, 3);PushQueue(&q, 4);PushQueue(&q, 5);printf("%d\n", SizeQueue(&q));printf("队尾 = %d\n", QueueBack(&q));printf("队头 = %d\n", QueueFront(&q));PopQueue(&q);PushQueue(&q, 5);PushQueue(&q, 6);printf("%d\n", SizeQueue(&q));printf("队尾 = %d\n", QueueBack(&q));printf("队头 = %d\n", QueueFront(&q));}
int main()
{Test2StackToQueue();system("pause");return 0;
}
运行结果:
使用两个栈实现一个队列相关推荐
- 多态指针访问虚函数不能被继承的类快速排序N皇后问题插入排序堆排序merge归并排序栈上生成对象两个栈实现一个队列...
多态 /*1. 要想实现覆盖(重写)父类必须声明为virtual,子类可以不声明为virtual.-->FunB()2. 派生类重写基类的虚函数实现多态,要求函数名.参数列表.返回值完全相同.( ...
- 【剑指offer】用两个栈实现一个队列
题目:两个栈实现一个队列. 栈的特点:先进后出,队列的特点是先进先出 思路:stack1放入数据:pop时,先判断stack2是否为空,如果不为空,直接pop,如果空,则push(stack1.pop ...
- 剑指offer五:两个栈实现一个队列
题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. package com.jianzhioffer;import java.util.Stack;publ ...
- 两个栈实现一个队列,两个队列实现一个栈
题目:用两个栈实现一个队列,用两个队列实现一个栈. 首先要了解栈和队列这两种数据结构各自的特点,栈是一种后入先出(Last In First Out,LIFO)的数据结构,队列是一种先进先出(Firs ...
- python 用两个栈实现一个队列
| 两个栈实现队列 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能.(若队列中没有元素 ...
- java实现-两个栈实现一个队列和两个队列实现一个栈
1.两个栈实现一个队列 思路:压入元素直接入stack1,删除元素先判断stack2中是否为空,如果不为空直接弹出:为空则将stack1中的元素取出压入 stack2中再弹出. 代码: import ...
- python ——两个队列实现一个栈两个栈实现一个队列
1.两个队列实现一个栈 进栈:元素入队列A 出栈:判断如果队列A只有一个元素,则直接出队.否则,把队A中的元素出队并入队B,直到队A中只有一个元素,再直接出队.为了下一次继续操作,互换队A和队B. p ...
- 两个栈实现一个队列与两个队列实现一个栈
http://blog.csdn.net/z84616995z/article/details/19204529 两个栈实现一个队列: 原理方法:用一个栈为主栈,一个栈为辅助栈存放临时元素. 入队:将 ...
- 【数据结构】(面试题)使用两个栈实现一个队列(详细介绍)
http://blog.csdn.net/hanjing_1995/article/details/51539578 使用两个栈实现一个队列 思路一: 我们设定s1是入栈的,s2是出栈的. 入队列,直 ...
- 两个栈实现一个队列/两个队列实现一个栈
http://blog.csdn.net/sinat_30472685/article/details/70157227 1两个栈实现一个队列 1.原理分析: 队列的主要操作有两个:入队操作和出队操作 ...
最新文章
- mac中flutter配置
- C++和操作系统面试问题分类
- BestCoder Round #84
- CG CTF WEB 综合题
- oracle扩展dblink数。
- led灯条维修_康佳液晶电视LED42F2200N灯条问题导致不开机故障修复
- android activity 测试,android – 最快的方法来创建一个模拟Activity来进行测试
- APICloud发布低代码开发平台
- 国外最顶级的人工智能网站资源
- Accidental override: The following declarations have the same JVM signature (getWindow()Landroid/vie
- Apache-Flink深度解析-JOIN-LATERAL-Time Interval(Time-windowed)
- CSS揭秘:6.复杂的背景图案(下)
- 树莓派Linux内核配置、编译以及烧录详细步骤
- 【华为机试029】合唱队
- [转载]只需要读内存实现的Dota全图
- 【JAVA】力扣第198场周赛代码+解题思路——【排名第 1 ~ 300 名的参赛者可获「微软中国」简历内推机会】做对前两道就能排到268/ 5778(4.6%)
- 微博抽奖男人 = 辣鸡, IG.WXZ为你证明
- 从浪潮之巅到千里之行,区块链能否实现赢家通吃?
- 目前计算机常用的硬盘类型,干货大放送,电脑硬盘分类你知道几个?
- Win11安装Android子系统
热门文章
- [2020-11-30 ]国产化操作系统调研
- java音频下载_java 实现网易云音乐下载和播放
- codeblock的若干使用技巧
- Spring实战——ByteArrayResource
- 向PDF写入签名日期
- 阿里云Linux安装软件镜像源
- 世界上最畅销的JSON和XML编辑器-Altova XMLSpy 2021版发布,升级版JSON Grid View归来!
- java 协同过滤算法_基于用户的协同过滤算法(Java实现或R语言实现)
- Curvy Little Bottles——ACM icpc 2012 word final problem B
- 永洪bi mysql连接配置_永洪BI 如果不同步数据是做的数据库直连吗?