剑指offter-面试题7.用两个栈实现队列
题目.用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead
分别完成在对尾插入节点和在队头删除节点。
该队列类模板如下:
template <typename T>
class CQueue
{
public:
void appendTail(const T& node);
T deleteHead() private:
stack<T> stack1;
stack<T> stack2;
11 }
首先先说明一些概念:
栈和队列是两种常用的抽象的数据结构。当然可以用数组和链表分别来实现。
1.栈的特点是先进后出,最后进入栈的元素最先出栈,而最先进入栈的元素却被
压在栈底,最后才能取出。
2.队列的特点是先进先出,类似于食堂打饭排队一样,先排队的先打饭,后
排队的后打饭。
3.这里我们声明了一个函数模板,函数模板其实是一种泛型编程思想,而
C++中的STL库大量使用这种思想,比如我们声明一个容器vector,这个
vector可以是整型的容器 vector<int> 可以是string类型的容器 vector<string>
然而vector对于不同的数据类型提供了同样的操作,这使得程序的可复用性
大大增强。
两个栈实现一个队列的插入和删除功能,步骤如下:
1.设两个栈为stack1和stack2
2.队列尾端插入直接插入在stack1中
3.对于删除队列头部节点,如果stack2不为空,
那么直接从stack2顶端取出元素(stack2中的元素为stack1中的元素顺序出栈再顺序插入到栈stack2中)
4.如果stack2为空,那么我们将stack1中的元素顺序出栈再压入stack2中。然后再从stack2中取出元素。
实现如下:
single.h中我们实现这个队列模板类:
#include <stack>
using namespace std; template <typename T>
class CQueue
{
public:
void appendTail(const T& node);
T deleteHead(); private:
stack<T> stack1;
stack<T> stack2;
}; template <typename T> void CQueue<T>::appendTail(const T& node)
{
stack1.push(node);
} template <typename T> T CQueue<T>::deleteHead()
{
if(!stack2.empty())
{
T temp=stack2.top();
stack2.pop();
return temp;
}
else
{
if(stack1.empty())
{
cout<<"队列元素为空,请先插入元素入队列\n";
}
else
{
while(!stack1.empty())
{
stack2.push(stack1.top());
stack1.pop();
} T temp=stack2.top();
stack2.pop();
return temp;
} }
}
在main.cpp中测试该队列类的插入和删除:
#include "single.h"
#include <iostream>
using namespace std; int main()
{
CQueue<int> queue;
int data;
queue.deleteHead();
cout<<"Please input the data you want to append in queue(0-exit):"<<endl;
while(true)
{
cin>>data;
if(data!=)
{
queue.appendTail(data);
}
else
{
break;
} } cout<<"Delete a queue node:"<<queue.deleteHead()<<endl;
cout<<"Delete a queue node:"<<queue.deleteHead()<<endl;
cout<<"Delete a queue node:"<<queue.deleteHead()<<endl;
queue.deleteHead(); return ;
}
运行截图如下:

我们再队列中依次进入1,2,3 删除时也是按照先进先出的顺序删除节点。当队列无元素时则会提醒我们队列为空。
好了,就到这里吧。是不是明白了呢?
剑指offter-面试题7.用两个栈实现队列的更多相关文章
- 剑指Offer-【面试题07:两个栈实现队列】
package com.cxz.question7; import java.util.Stack; /** * 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数appendTail 和del ...
- 剑指Offer:面试题7——用两个栈实现队列(java实现)
题目描述:用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 首先定义两个栈 Stack<Integer> stack1 = new Stack<I ...
- 剑指Offer - 九度1512 - 用两个栈实现队列
剑指Offer - 九度1512 - 用两个栈实现队列2013-11-29 21:23 题目描述: 用两个栈来实现一个队列,完成队列的Push和Pop操作.队列中的元素为int类型. 输入: 每个输入 ...
- 剑指offer【05】- 用两个栈实现队列(java)
题目:用两个栈实现队列 考点:栈和队列 题目描述:用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 解题思路:每次psuh是时先将stack2清空放入stck1(保 ...
- 剑指offer第二版-9.用两个栈实现队列
描述:使用两个栈实现一个队列.队列中实现尾部插入和头部删除函数. 思路:stack1负责插入,stack2负责弹出,如果stack2为空了,将stack1的元素依次弹出并存放到stack2中,之后对s ...
- 剑指offer(9)——用两个栈实现队列
题目: 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能. 思路: 首先定义两个栈stack1. ...
- JS 剑指Offer(六) 用两个栈实现队列
题目:用两个栈实现队列,实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入整数和在队列头部删除整数,若队列中没有元素deleteHead返回-1 分析:在队列的尾部插入 ...
- 剑指offer(5)用两个栈实现队列
题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 题目分析 栈是先进后出,队列是先进先出,因此两个栈,一个用来push,一个用来pop,同时注意下两个栈不 ...
- 剑指Offer_编程题之用两个栈实现队列
题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型.
- 【剑指Offer】5、用两个栈实现队列
题目描述: 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 解题思路: 本题的基本意图是:用两个后入先出的栈来实现先入先出的队列.对于这个问题,我 ...
随机推荐
- WPF ICommand 用法
基础类,继承与ICommand接口 using System; using System.Collections.Generic; using System.Linq; using System.Te ...
- 分享一个3D球面标签云
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 文件系统 busybox and initramfs
1.busybox制作根文件系统 http://wenku.baidu.com/link?url=h2m_xrj6OsLiHVVhMY2e0C7WKikw_H3dZY_b4mUiW1E7AEf_q34 ...
- go中string和slice no-copy转换
在go里面,string和slice的互换是需要进行内存拷贝的,虽然在底层,它们都只是用 pointer + len来表示的一段内存. 通常,我们不会在意string和slice的转换带来的内存拷贝性 ...
- 【转】Visual Studio 2010在数据库生成随机测数据
测试在项目中是很重要的一个环节,在Visual Studio 2010中,在测试方面已经有很好的支持了,比如有单元测试,负载测试等等.在数据测试的方面,Visual Studio 2010,还支持对数 ...
- 调用[[UIDevice currentDevice] userInterfaceIdiom]==UIUserInterfaceIdiomPad判断设备
将模拟器改为Ipad时,调用[[UIDevice currentDevice] userInterfaceIdiom]==UIUserInterfaceIdiomPad判断设备是否为Ipad,但程序并 ...
- SPOJ 4206 Fast Maximum Matching (二分图最大匹配 Hopcroft-Carp 算法 模板)
题目大意: 有n1头公牛和n2头母牛,给出公母之间的m对配对关系,求最大匹配数.数据范围: 1 <= n1, n2 <= 50000, m <= 150000 算法讨论: 第一反应 ...
- 写一个Windows上的守护进程(8)获取进程路径
写一个Windows上的守护进程(8)获取进程路径 要想守护某个进程,就先得知道这个进程在不在.我们假设要守护的进程只会存在一个实例(这也是绝大部分情形). 我是遍历系统上的所有进程,然后判断他们的路 ...
- uva 1597 Searching the Web
The word "search engine" may not be strange to you. Generally speaking, a search engine se ...
- (转) 学习C++ -> 引用( References )
学习C++ -> 引用( References ) 一.引用的介绍 引用就是某一变量(目标)的一个别名, 相当于同一个人有了两个名字, 无论喊哪一个名字实际上都是指的同一个人. 同样, 在 ...