剑指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;
}

本章完!


目录
相关文章
|
6天前
|
存储 Java 编译器
【面试知识】Java内存分配之常量池、堆、栈
【面试知识】Java内存分配之常量池、堆、栈
|
6天前
|
算法 容器
【算法训练营】队列合集(2) 2073. 买票需要的时间 || 面试题 03.04. 化栈为队 ||
【算法训练营】队列合集(2) 2073. 买票需要的时间 || 面试题 03.04. 化栈为队 ||
64 0
|
6天前
|
存储 算法 调度
【数据结构入门精讲 | 第五篇】栈知识点及考研408、企业面试练习
【数据结构入门精讲 | 第五篇】栈知识点及考研408、企业面试练习
43 0
|
6天前
|
存储 前端开发 搜索推荐
【数据结构入门精讲 | 第六篇】队列知识点及考研408、企业面试练习
【数据结构入门精讲 | 第六篇】队列知识点及考研408、企业面试练习
78 0
|
6天前
|
设计模式 消息中间件 Java
面试官:什么是JIT、逃逸分析、锁消除、栈上分配和标量替换?
面试官:什么是JIT、逃逸分析、锁消除、栈上分配和标量替换?
568 1
|
6天前
|
存储 程序员 C++
面试题:C++堆和栈的区别?
面试题:C++堆和栈的区别?
25 0
|
6天前
面试题 03.05:栈排序
面试题 03.05:栈排序
27 0
|
6天前
面试题 03.04:化栈为队
面试题 03.04:化栈为队
26 5
|
6天前
面试题 03.02:栈的最小值
面试题 03.02:栈的最小值
18 0
|
6天前
|
存储 Java
【数据结构】队列的使用|模拟实现|循环队列|双端队列|面试题
【数据结构】队列的使用|模拟实现|循环队列|双端队列|面试题
59 1