栈实现队列&&队列实现栈

2023-05-16

背景知识:


动态栈的模拟实现:http://blog.csdn.net/double_happiness/article/details/70170984

队列的模拟实现:http://blog.csdn.net/double_happiness/article/details/70176907


题目:


(1)用两个栈实现一个队列

(2)用两个队列实现一个栈


用两个栈实现一个队列


分析:


首先需要清楚的一点是栈的特性是先进后出,并且只允许在栈顶进行操作(即push和pop都在站顶进行),队列的特性则是先进先出,可以在在两端进行操作(push在队尾,pop则是在队顶进行),明白这两个特性之后问题就不难解决了;

因为栈是先进后出的,所以栈的插入操作就是在一端插入,对照到队列中就是队尾,因此push操作就是直接push,主要实现的是用栈来实现pop操作,要用栈来实现pop操作也很简单,我们在栈自身的结构下再添加一个辅助栈,辅助栈用来保存pop出来的数据,然后再将辅助栈中的元素进行pop就可以完成先入先出的特性,可能描述的不是很清楚,下面用图示来解释一下上述操作。


图示:




代码实现:

(说明:在此是针对面试题因此就不很详细的实现队列的所有内部接口,详细实现见上背景知识


#include <iostream>
using namespace std;
#include <stack>

template<class T>
class Queue
{
public:
	void Push(const T& data)		//在队尾添加元素
	{
		input.push(data);
	}

	void Pop()		//删除对头元素
	{
		while (!input.empty())		//先将输入栈中的数据导入到输出栈
		{
			output.push(input.top());
			input.pop();
		}

		if (!output.empty())		//再将栈中的从栈顶依次pop出来刚好是先进去的
		{
			//input.push(output.top());
			output.pop();
		}
	}
protected:
	stack<int> input;		//输入栈
	stack<int> output;		//输出栈
};

int main()
{
	Queue<int> q;
	q.Push(1);
	q.Push(2);
	q.Push(3);
	q.Push(4);
	q.Push(5);

	q.Pop();
	q.Pop();
	q.Pop();
	q.Pop();
	q.Pop();

	system("pause");
	return 0;
}

两个队列实现一个栈


思路和上面的实现方式基本上相同,需要的是完成栈先进后出的特性,这里就不作赘述,直接给出具体的代码实现。


代码实现:


#include<iostream>
using namespace std;

#include<queue>
#include<stack>

template<class T>
class Stack
{
public:
	void Push(const T& data)
	{
		input.push(data);
	}

	void Pop()
	{
		while (input.size()>0)
		{
			output.push(input.front());
			input.pop();
		}
		if (!output.empty())
		{
			output.pop();
		}
	}
protected:
	queue<int> input;
	queue<int> output;
};
int main()
{
	Stack<int> s;
	s.Push(1);
	s.Push(2);
	s.Push(3);
	s.Push(4);
	s.Push(5);

	s.Pop();
	s.Pop();
	s.Pop();
	s.Pop();
	s.Pop();

	system("pause");
	return 0;
}



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

栈实现队列&&队列实现栈 的相关文章

随机推荐

  • 继承小结

    1 概念 面向对象程序设计使代码可以实现复用的最重要手段 xff0c 允许程序员在原有类特性的基础上进行扩展 xff0c 增加新的功能 2 定义格式 xff1a 首先是一个冒号 xff0c 后面紧跟以逗号分隔的基类列表 xff0c 其中每个
  • 到底多态有多难

    1 概念 多态 简单来说就是一种事物具有多种形式或者形态的特征 xff0c 好比我们生活中最简单的事物 xff0c 就像每天都会用到的水 xff0c 水有三态 xff0c 即固态 液态和气态 生活中这种多多态的例子很多 xff0c 同样在我
  • 解析模板(上)--模板函数

    模板引出 xff1a 在学习关于类的特性中 xff0c 有一个重要的特性叫做多态 xff0c 同样关于模板的学习也可以简单的把它理解成一种多态 xff0c 只不过模板中所涉及的多态是关于类型的替换 xff0c 正如在生活中使用模具一样 xf
  • 模板&仿函数的应用--冒泡排序

    普通版冒泡排序 对于冒泡排序的算法大家并不陌生 xff0c 将相临两个数一次比较 xff0c 然后将最大值或者最小值先排出来 xff0c 一般来说这样的话我们需要在碗面写两个函数来分别实现这两个算法 xff0c 程序代码如下 xff1a s
  • String类模拟

    span style font size 24px class String friend ostream amp operator lt lt ostream amp os String amp s 输出运算符重载 friend istr
  • win10主机ping不通win10虚拟机

    原因是ICMP回显请求规则未开启 xff0c 解决方法在文章末尾 环境说明 win10虚拟机 192 168 136 136 win10虚拟机采用的网络连接是 NAT 模式 ipconfig结果如下 xff1a 以太网适配器 Etherne
  • <操作系统> 理发店问题(选做)C语言实现

    问题描述 xff1a 代码 xff1a span class token macro property span class token directive keyword include span span class token str
  • 特殊矩阵的压缩存储及转置

    一 对称矩阵及其压缩存储 1 对称矩阵 在矩阵中最特殊的一类应该属于对称矩阵 xff0c 对称矩阵的行和列是对应相等的 对称矩阵就是关于主对角线对称 xff0c 两边的元素的值对应相等 xff0c 在数学中我们把用主对角线隔开 xff0c
  • STL浅析set&map

    map和set的底层实现原理和接口使用 1 set和map的底层实现 set和map属于STL中的一种关联式容器 xff0c 底层实现是红黑树 2 set容器的特点 1 set和map 容器中的元素自动进行有序排列 默认为升序排列 xff1
  • Linux下的文件操作权限

    Linux下进入一个目录需要什么权限 xff1f 普通用户下 xff1a 首先我们在普通用户下 xff0c 取消文件code的所有权限chmod 000 code 当我们执行cd code 想进入当前目录时 xff0c 发现权限不允许 接下
  • linux下的常见命令

    cd change directory 进入个人的主目录 cd home 进入 39 home 39 目录 39 cd 返回上一级目录 cd 返回上两级目录 cd 返回上次所在的目录 ls list 查看目录中的文件 ls l 显示文件和目
  • task_struct结构体成员小结

    背景知识 task stuct结构体 被称为进程描述符 xff0c 用 来管理进程Linux内核的进程 xff0c 这个结构体包含了一个进程所需的所有信息 它定义在 include linux sched h文件中 可以说它是linux内核
  • Linux下的简单进度条实现

    进度条 计算机在处理任务时 xff0c 实时的 xff0c 以图片形式显示处理任务的速度 xff0c 完成度 xff0c 剩余未完成任务量的大小 xff0c 和可能需要处理时间 xff0c 一般以长方形条状显示 主要功能 xff1a 1 显
  • 九大排序之——希尔排序

    希尔排序 xff1a 思想 xff1a 希尔排序是为了防止直接插入排序出现最坏情况所做的一种改进 xff0c 将原本的排序过程分为预排序和直接插入排序两个阶段 预排序阶段 xff1a 将整个预排序的序列分为若干个待排序的子序列 xff0c
  • 僵尸进程与孤儿进程模拟实现

    背景知识 僵尸进程 xff08 Zombies xff09 xff1a 1 僵尸进程是一个比较特殊的状态 xff0c 当进程退出父进程 xff08 使用wait 系统调用 xff09 没有没有读取到子进程退出的返回代码时就会产生僵尸进程 僵
  • 队列模拟实现

    队列的特点 xff1a 先进先出 后进后出 队列的常见操作 xff1a Push 往队尾插入一个元素 Pop 从队头删除一个元素 Front 返回队列的第一个元素 Back 返回队列的最后一个元素 Size 求队列的元素个数 Empty 判
  • ssh端口转发(之kettle ssh方式连接数据库)

    ssh参数解释 格式 ssh user 64 host command 选项 xff1a 1 xff1a 强制使用ssh协议版本1 xff1b 2 xff1a 强制使用ssh协议版本2 xff1b 4 xff1a 强制使用IPv4地址 xf
  • str库函数模拟实现

    常见str函数功能表 xff1a strcat 将字符串str2连接到str1之后 xff0c 并返回指针str1 strncat 将字符串from 中至多count个字符连接到字符串to中 xff0c 追加空值结束符 返回处理完成的字符串
  • min栈实现

    题目 xff1a 实现一个栈 xff0c 要求实现Push xff08 出栈 xff09 Pop xff08 入栈 xff09 Min xff08 返回最小值的操作 xff09 的时间复杂度为O 1 分析 xff1a 这道题目的主要难点在于
  • 栈实现队列&&队列实现栈

    背景知识 xff1a 动态栈的模拟实现 xff1a http blog csdn net double happiness article details 70170984 队列的模拟实现 xff1a http blog csdn net