剑指Offer - 面试题9:用俩个栈实现队列

简介: 剑指Offer - 面试题9:用俩个栈实现队列

题目

用俩个栈实现一个队列。队列的声明如下,请实现它的俩个函数appendTail和deleteHead,分别完成在队列尾部插入节点和在队列头部删除节点的功能。

template <typename T> class CQueue
{
public:
  CQueue(void);
  ~CQueue(void);
  void appendTail(const T& node);
  T deleteHead();
private:
  stack<T> stack1;
  stack<T> stack2;
};

分析

当我们添加节点时,放在stack1里面,如果我们需要输出时候,用stack2,若没有数据就把stack1里面的数据依次搬过来,刚好在stack1最里面的数据,到stack2最上面,删除即可。实现如下图



C++

#include<iostream>
#include<stack>
using namespace std;
template <typename T> class CQueue
{
public:
  CQueue(void);
  ~CQueue(void);
  void appendTail(const T& node);
  T deleteHead();
private:
  stack<T> stack1;
  stack<T> stack2;
};
template<typename T>
CQueue<T>::CQueue(void)
{
}
template<typename T>
CQueue<T>::~CQueue(void)
{
}
template <typename T> void CQueue<T>::appendTail(const T& node)
{
  stack1.push(node);
}
template <typename T> T CQueue<T>::deleteHead()
{
  if (stack2.empty() == true)
  {
    while (stack1.empty() != true)
    {
      stack2.push(stack1.top());
      stack1.pop();
    }
  }
  if (stack2.empty() == true)
  {
    cout << "queue is empty!" << endl;
    exit(EXIT_FAILURE);
  }
  T head = stack2.top();
  stack2.pop();
  return head;
}
int main()
{
  CQueue<int> c;
  //入队
  c.appendTail(2);
  c.appendTail(3);
  c.appendTail(5);
  //出队
  cout << c.deleteHead() << endl;
  cout << c.deleteHead() << endl;
  cout << c.deleteHead() << endl;
  cout << c.deleteHead() << endl;
  return 0;
}


扩展题

用俩个队列实现一个栈。

分析

按照上面的思想,我们还是可以将queue1作为新来数据的存放点。每次进行输出,都将queue1中的数据除了最后一个都移动到queue2中,然后把唯一一个queue1中的数据保存起来,最后用于函数返回,再把所有queue2中的数据搬回queue1中即可。

下图为5、6、7已经进入queue1的队列的删除过程。

#include<iostream>
#include<queue>
using namespace std;
template <typename T> class CStack
{
public:
  CStack(void);
  ~CStack(void);
  void appendelem(const T& node);
  T deleteelem();
private:
  queue<T> queue1;
  queue<T> queue2;
};
template<typename T>
CStack<T>::CStack(void)
{
}
template<typename T>
CStack<T>::~CStack(void)
{
}
template<typename T>
void CStack<T>::appendelem(const T& node)
{
  queue1.push(node);
}
template<typename T>
T CStack<T>::deleteelem()
{
  if (queue1.empty() == true)
  {
    cout << "stack is empty!" << endl;
    exit(EXIT_FAILURE);
  }
  int size = queue1.size();
  while (size > 1)
  {
    queue2.push(queue1.front());
    queue1.pop();
    size--;
  }
  T tmp = queue1.front();
  queue1.pop();
  size = queue2.size();
  while (size > 0)
  {
    queue1.push(queue2.front());
    queue2.pop();
    size--;
  }
  return tmp;
}
int main()
{
  CStack<int> c;
  //入栈
  c.appendelem(3);
  c.appendelem(4);
  c.appendelem(5);
  //出栈
  cout << c.deleteelem() << endl;
  cout << c.deleteelem() << endl;
  cout << c.deleteelem() << endl;
  cout << c.deleteelem() << endl;
  return 0;
}

本章完!


目录
相关文章
|
1天前
|
存储 网络协议 安全
30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场
本文精选了 30 道初级网络工程师面试题,涵盖 OSI 模型、TCP/IP 协议栈、IP 地址、子网掩码、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN 等基础知识和技术,帮助小白们充分准备面试,顺利踏入职场。
9 2
|
3月前
|
存储 安全 Java
JVM常见面试题(二):JVM是什么、由哪些部分组成、运行流程,JDK、JRE、JVM关系;程序计数器,堆,虚拟机栈,堆栈的区别是什么,方法区,直接内存
JVM常见面试题(二):JVM是什么、由哪些部分组成、运行流程是什么,JDK、JRE、JVM的联系与区别;什么是程序计数器,堆,虚拟机栈,栈内存溢出,堆栈的区别是什么,方法区,直接内存
JVM常见面试题(二):JVM是什么、由哪些部分组成、运行流程,JDK、JRE、JVM关系;程序计数器,堆,虚拟机栈,堆栈的区别是什么,方法区,直接内存
|
3月前
|
存储 设计模式 Java
Unity精华☀️ 面试“堆、栈”误区!这样做可能反而会降低吸引力
Unity精华☀️ 面试“堆、栈”误区!这样做可能反而会降低吸引力
|
3月前
|
安全 编译器 C++
【剑指offer】2.2编程语言(p22-p25)——面试题1:string赋值运算函数
【剑指offer】2.2编程语言(p22-p25)——面试题1:string赋值运算函数
|
3月前
|
安全 Java
虚拟机栈的五道面试题
这篇文章提供了关于Java虚拟机栈的五个面试问题,涉及栈溢出的情况、栈大小调整、栈内存的分配、垃圾回收与虚拟机栈的关系以及局部变量的线程安全性。
|
4月前
|
存储 安全 Java
Java面试题:在JVM中,堆和栈有什么区别?请详细解释说明,要深入到底层知识
Java面试题:在JVM中,堆和栈有什么区别?请详细解释说明,要深入到底层知识
85 3
|
3月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
6天前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
7天前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
26 4
|
1月前
|
算法 Java 数据中心
探讨面试常见问题雪花算法、时钟回拨问题,java中优雅的实现方式
【10月更文挑战第2天】在大数据量系统中,分布式ID生成是一个关键问题。为了保证在分布式环境下生成的ID唯一、有序且高效,业界提出了多种解决方案,其中雪花算法(Snowflake Algorithm)是一种广泛应用的分布式ID生成算法。本文将详细介绍雪花算法的原理、实现及其处理时钟回拨问题的方法,并提供Java代码示例。
66 2