剑指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类型. 解题思路: 本题的基本意图是:用两个后入先出的栈来实现先入先出的队列.对于这个问题,我 ...
随机推荐
- MVC后台绑定dropdownList
public ActionResult Index() { List<SelectListItem> items = new List<Se ...
- 从运维角度浅谈 MySQL 数据库优化
一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善.这篇博文主要谈MySQL数据库发展周期中所面临的问题及优化方案,暂且抛开前端应用不说,大致分 ...
- Windows无需CygWin 使用NDK开发
无需cygwin,使用NDK进行开发 NDK从7开始自带编译器,在windows上无需配置cygwin的环境. 在eclips中配置NDK路径 在eclipse中点击菜单栏window-Perfe ...
- python urllib基础学习
# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #使用python创建一个简单的WEB客户端 import urll ...
- [CSS] CSS Transitions: Delays and Multiple Properties
<!DOCTYPE html> <html> <head> <script src="https://code.jquery.com/jquery- ...
- 改进的简单Tooltips显示
使用js简单改进了Tooltips的显示效果,可进一步使用CSS对改进的Tooltips进行美化. 前台布局代码: <asp:Panel ID="Panel1" runat= ...
- 两个iframe联动刷新 JS代码
1.iframe代码: <iframe id="famUpload" src="report.asp?syear=<%=Year(now())%>&qu ...
- git 分支的基本操作
git分支的基本操作. 创建私有分支: $git branch branchName commitID $git checkout -b branchName commitID 注意: ...
- MVC(Model View Controller)框架
MVC框架 同义词 MVC一般指MVC框架 MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一 ...
- (转) Special members
原地址:http://www.cplusplus.com/doc/tutorial/classes2/ Special members [NOTE: This chapter requires p ...