zoukankan      html  css  js  c++  java
  • 剑指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<<"队列元素为空,请先插入元素入队列
    ";
    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 删除时也是按照先进先出的顺序删除节点。当队列无元素时则会提醒我们队列为空。

    好了,就到这里吧。是不是明白了呢?

  • 相关阅读:
    nodejs程序发布的jenkins自动化脚本和问题记录
    jenkins代码rsync推送脚本带日志记录和代码分机房处理示例
    django入门到精通⑥消息管理器的升级处理,对关键词进行过滤示例
    django入门到精通⑤mako模板的使用
    django入门到精通④jinja2模板的使用
    django入门到精通③template模板功能和常用标签过滤器的使用
    hdfs副本调整不生效
    macOS 系统中,开发工具列表
    查看系统中安装了哪些python版本
    -p py, --python py target interpreter for which to create a virtual (either absolute path or identifier string) 中 identifier string 的含义
  • 原文地址:https://www.cnblogs.com/vpoet/p/4664825.html
Copyright © 2011-2022 走看看