题目:使用两个栈实现一个队列。


栈:后进先出。
队列:先进先出。


入队列:
  直接入栈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;
}


运行结果:

使用两个栈实现一个队列相关推荐

  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. mac中flutter配置
  2. C++和操作系统面试问题分类
  3. BestCoder Round #84
  4. CG CTF WEB 综合题
  5. oracle扩展dblink数。
  6. led灯条维修_康佳液晶电视LED42F2200N灯条问题导致不开机故障修复
  7. android activity 测试,android – 最快的方法来创建一个模拟Activity来进行测试
  8. APICloud发布低代码开发平台
  9. 国外最顶级的人工智能网站资源
  10. Accidental override: The following declarations have the same JVM signature (getWindow()Landroid/vie
  11. Apache-Flink深度解析-JOIN-LATERAL-Time Interval(Time-windowed)
  12. CSS揭秘:6.复杂的背景图案(下)
  13. 树莓派Linux内核配置、编译以及烧录详细步骤
  14. 【华为机试029】合唱队
  15. [转载]只需要读内存实现的Dota全图
  16. 【JAVA】力扣第198场周赛代码+解题思路——【排名第 1 ~ 300 名的参赛者可获「微软中国」简历内推机会】做对前两道就能排到268/ 5778(4.6%)
  17. 微博抽奖男人 = 辣鸡, IG.WXZ为你证明
  18. 从浪潮之巅到千里之行,区块链能否实现赢家通吃?
  19. 目前计算机常用的硬盘类型,干货大放送,电脑硬盘分类你知道几个?
  20. Win11安装Android子系统

热门文章

  1. [2020-11-30 ]国产化操作系统调研
  2. java音频下载_java 实现网易云音乐下载和播放
  3. codeblock的若干使用技巧
  4. Spring实战——ByteArrayResource
  5. 向PDF写入签名日期
  6. 阿里云Linux安装软件镜像源
  7. 世界上最畅销的JSON和XML编辑器-Altova XMLSpy 2021版发布,升级版JSON Grid View归来!
  8. java 协同过滤算法_基于用户的协同过滤算法(Java实现或R语言实现)
  9. Curvy Little Bottles——ACM icpc 2012 word final problem B
  10. 永洪bi mysql连接配置_永洪BI 如果不同步数据是做的数据库直连吗?