剑指offter-面试题7.用两个栈实现队列
题目.用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead分别完成在对尾插入节点和在队头删除节点。
该队列类模板如下:
1 template <typename T> 2 class CQueue 3 { 4 public: 5 void appendTail(const T& node); 6 T deleteHead() 7 8 private: 9 stack<T> stack1; 10 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中我们实现这个队列模板类:
1 #include <stack> 2 using namespace std; 3 4 template <typename T> 5 class CQueue 6 { 7 public: 8 void appendTail(const T& node); 9 T deleteHead(); 10 11 private: 12 stack<T> stack1; 13 stack<T> stack2; 14 }; 15 16 template <typename T> void CQueue<T>::appendTail(const T& node) 17 { 18 stack1.push(node); 19 } 20 21 22 template <typename T> T CQueue<T>::deleteHead() 23 { 24 if(!stack2.empty()) 25 { 26 T temp=stack2.top(); 27 stack2.pop(); 28 return temp; 29 } 30 else 31 { 32 if(stack1.empty()) 33 { 34 cout<<"队列元素为空,请先插入元素入队列\n"; 35 } 36 else 37 { 38 while(!stack1.empty()) 39 { 40 stack2.push(stack1.top()); 41 stack1.pop(); 42 } 43 44 T temp=stack2.top(); 45 stack2.pop(); 46 return temp; 47 } 48 49 } 50 }
在main.cpp中测试该队列类的插入和删除:
1 #include "single.h" 2 #include <iostream> 3 using namespace std; 4 5 6 int main() 7 { 8 CQueue<int> queue; 9 int data; 10 queue.deleteHead(); 11 cout<<"Please input the data you want to append in queue(0-exit):"<<endl; 12 while(true) 13 { 14 cin>>data; 15 if(data!=0) 16 { 17 queue.appendTail(data); 18 } 19 else 20 { 21 break; 22 } 23 24 } 25 26 cout<<"Delete a queue node:"<<queue.deleteHead()<<endl; 27 cout<<"Delete a queue node:"<<queue.deleteHead()<<endl; 28 cout<<"Delete a queue node:"<<queue.deleteHead()<<endl; 29 queue.deleteHead(); 30 31 return 0; 32 }
运行截图如下:
我们再队列中依次进入1,2,3 删除时也是按照先进先出的顺序删除节点。当队列无元素时则会提醒我们队列为空。
好了,就到这里吧。是不是明白了呢?
剑指offter-面试题7.用两个栈实现队列相关推荐
- 剑指Offe面试题:用两个栈实现队列
用两个栈实现队列 题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 分析 首先可以自己尝试使用1 2 3少量元素的入栈出栈摸索两个栈的使用,从特殊到一般 ...
- 剑指Offer - 面试题9. 用两个栈实现队列
1. 题目 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能.(若队列中没有元素,del ...
- 剑指offer面试题[7]-用两个栈实现队列
题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 解题思路: 一个队列包含两个栈,这道题目的意图是要求我们操作两个"先进后出"的栈实现 ...
- 剑指offer面试题09. 用两个栈实现队列(队列、栈)
题目描述 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能.(若队列中没有元素,dele ...
- 剑指offer第二版-9.用两个栈实现队列
描述:使用两个栈实现一个队列.队列中实现尾部插入和头部删除函数. 思路:stack1负责插入,stack2负责弹出,如果stack2为空了,将stack1的元素依次弹出并存放到stack2中,之后对s ...
- 【剑指offer-Java版】07用两个栈实现队列
两个栈实现一个队列:stack_1 stack_2 入队操作:直接入stack_1 出队操作:如果stack_2不为空,那么从其中弹出一个作为出队元素,否则将stack_1元素全部依次压入stack_ ...
- 剑指offer(05)用两个栈实现队列
参考:https://www.cnblogs.com/wanghui9072229/archive/2011/11/22/2259391.html 思路1:始终维护s1作为存储空间,以s2作为临时缓冲 ...
- 剑指offer——面试题37:两个链表的第一个公共结点
剑指offer--面试题37:两个链表的第一个公共结点 20180906整理 Solution1: 时间复杂度为O(n2)O(n2)O(n^2)的垃圾算法 /* struct ListNode {in ...
- 剑指offer:面试题09. 用两个栈实现队列
题目:用两个栈实现队列 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能.(若队列中没有 ...
- [剑指offer]面试题37:两个链表的第一个公共结点
面试题37:两个链表的第一个公共结点 题目:输入两个链表,找出它们的第一个公共结点.链表结点定义如下: struct ListNode {int val;ListNode *next;ListNode ...
最新文章
- “Attention is All You Need 翻译
- modal ajax,在Modal中调用Vue.js AJAX
- php get_token_all函数,pimcore getObjectByToken函数PHP对象注入漏洞
- 计算payload长度c语言,C语言0长度数组(可变数组/柔性数组)详解
- jeewx-qywx-api 1.0版发布,微信企业号Java SDK
- I²C那点事儿(一)
- drupal7 代码生成用户,并自动登录
- 还在用上古的 ls 命令管理文件吗,是时候使用终端文件管理神器 lf 了!
- paypal php 方式,如何使用PHP向paypal汇款
- 多媒体架构---display介绍
- It's only too late if you decide it is. Get busy living, or get busy dying(转)
- Mathematica三维画图一些技巧
- SparkSql-redis:将查询到的结果保存到redis中
- 对List的数据进行分组
- 黄仁勋没有回应,英伟达没有新品
- 大漠为什么不支持win10_大漠插件3.1233 支持WIN10的游戏后台么
- 字符串和转义字符的知识和应用
- 论文查找路径 查找IEEE、ScienceDirect论文 免费查看的方法
- Falcon(二)——架构详解
- DHCP:(10)H3C DHCP features DHCP ARP安全控制