zoukankan      html  css  js  c++  java
  • JZ-C-07

    剑指offer第七题:利用两个栈实现队列

     1 //============================================================================
     2 // Name        : JZ-C-07.cpp
     3 // Author      : Laughing_Lz
     4 // Version     :
     5 // Copyright   : All Right Reserved
     6 // Description :利用两个栈实现队列
     7 //============================================================================
     8 
     9 #include <iostream>
    10 #include <stack>
    11 using namespace std;
    12 template<typename T> //类模板,typename可替换为class
    13 class CQueue {
    14 public:
    15     CQueue(void); //缺省构造函数
    16     ~CQueue(void);
    17     void appendTail(const T& node); // 在队列末尾添加一个结点
    18     T deleteHead();
    19 private:
    20     stack<T> stack1;
    21     stack<T> stack2;
    22 };
    23 //对使用类模板的类的函数,都要在前面加上类模板
    24 template<typename T> CQueue<T>::CQueue(void) {
    25 }
    26 template<typename T> CQueue<T>::~CQueue(void) {
    27 }
    28 /**
    29  *队列的插入在队列尾部:此处实现是在stack1里push
    30  */
    31 template<typename T> void CQueue<T>::appendTail(const T& element) { //这里为什么是&呢?
    32     stack1.push(element);
    33 }
    34 /**
    35  * 队列的取出在队列头部:此处实现是根据stack2中的栈顶元素是最先进入队列的元素(通过判断stack2是否为空)
    36  */
    37 template<typename T> T CQueue<T>::deleteHead() {
    38     if (stack2.empty()) {
    39         //将stack1全部压入stack2中
    40         while (!stack1.empty()) {
    41             T& node = stack1.top();
    42             stack1.pop();
    43             stack2.push(node);
    44         }
    45     }
    46     if (stack2.empty()) { //再次判断,如果stack2栈空,说明队列已空★
    47         cout << "队列为空" << endl;
    48         throw new exception();
    49     }
    50     //从stack2中取出栈顶元素
    51     T node = stack2.top();
    52     stack2.pop();
    53     return node;
    54 }
    55 int main() {
    56     CQueue<char> queue;
    57     queue.appendTail('a');
    58     queue.appendTail('b');
    59     queue.appendTail('c');
    60     char result1 = queue.deleteHead();
    61     queue.appendTail('d');
    62     char result2 = queue.deleteHead();
    63     cout<<result1<<endl;
    64     cout<<result2<<endl;
    65     char result3 = queue.deleteHead();
    66     cout<<result3<<endl;
    67     char result4 = queue.deleteHead();
    68     cout<<result4<<endl;
    69 //    char result5 = queue.deleteHead();//队列已为空
    70     return 0;
    71 }

    扩展:利用两个队列实现栈

     1 //============================================================================
     2 // Name        : JZ-C-07.cpp
     3 // Author      : Laughing_Lz
     4 // Version     :
     5 // Copyright   : All Right Reserved
     6 // Description :扩展:利用两个队列实现栈
     7 //============================================================================
     8 
     9 #include <iostream>
    10 #include <queue>
    11 using namespace std;
    12 template<typename T> //类模板,typename可替换为class
    13 class CStack {
    14 public:
    15     CStack(void); //缺省构造函数
    16     ~CStack(void);
    17     void appendHead(const T& node); // 入栈
    18     T deleteHead(); //出栈
    19 private:
    20     queue<T> queue1;
    21     queue<T> queue2;
    22 };
    23 //对使用类模板的类的函数,都要在前面加上类模板
    24 template<typename T> CStack<T>::CStack(void) {
    25 }
    26 template<typename T> CStack<T>::~CStack(void) {
    27 }
    28 /**
    29  *入栈:此处实现是判断两个队列哪个为不为空(为空的队列用来出栈,交替使用)
    30  */
    31 template<typename T> void CStack<T>::appendHead(const T& element) { //这里为什么是&呢?
    32     if (!queue1.empty()) {
    33         queue1.push(element);
    34     } else {
    35         queue2.push(element); //默认第一次入栈插入第二个队列
    36     }
    37 }
    38 /**
    39  * 出栈:此处实现是将某个不为空的队列除最后一个元素全部出队列并插入另一个队列中
    40  */
    41 template<typename T> T CStack<T>::deleteHead() {
    42     if (queue1.empty() && queue2.empty()) {
    43         cout << "栈已为空,错误!" << endl;
    44         throw new exception();
    45     } else if (!queue1.empty()) {
    46         while (queue1.size() > 1) {
    47             T& node = queue1.front();
    48             queue1.pop();
    49             queue2.push(node);
    50         }
    51         T& node = queue1.front(); //将最后压入的元素出栈,出栈后queue1为空
    52         queue1.pop();
    53         return node;
    54     } else if (!queue2.empty()) {
    55         while (queue2.size() > 1) {
    56             T& node = queue2.front();
    57             queue2.pop();
    58             queue1.push(node);
    59         }
    60         T& node = queue2.front(); //将最后压入的元素出栈,出栈后queue2为空
    61         queue2.pop();
    62         return node;
    63     }
    64     return 0;//并没意义
    65 }
    66 int main() {
    67     CStack<char> stack;
    68     stack.appendHead('a');
    69     stack.appendHead('b');
    70     stack.appendHead('c');
    71     stack.appendHead('d');
    72     char result1 = stack.deleteHead();
    73     cout << result1 << endl;
    74     stack.appendHead('e');
    75     char result2 = stack.deleteHead();
    76     cout << result2 << endl;
    77     char result3 = stack.deleteHead();
    78     cout << result3 << endl;
    79     char result4 = stack.deleteHead();
    80     cout << result4 << endl;
    81     char result5 = stack.deleteHead();
    82     cout << result5 << endl;
    83 //    char result6 = stack.deleteHead();//栈已为空
    84 //    cout << result6 << endl;
    85     return 0;
    86 }
    —————————————————————————————————————行走在人猿的并行线——Laughing_Lz
  • 相关阅读:
    [C++] inline内联函数使用方法
    [C++] new和delete运算符使用方法
    [C++] namespace命名空间和using用法
    [C++] 引用类型&
    [C++] wchar_t关键字使用方法
    [C++] typeid关键字使用方法
    json_encode转化索引数组之后依然还是数组的问题
    微信网页授权 的流程
    验证码比较hash_equals 方法
    laravel 模型观察器
  • 原文地址:https://www.cnblogs.com/Laughing-Lz/p/5506442.html
Copyright © 2011-2022 走看看