标签:栈
用两个栈实现队列的效果,可以入栈,出栈,判空等。。。
实现的栈基本功能
lstack.h
#ifndef _LSTACK_H #define _LSTACK_H #include <stdexcept> using namespace std; // 基于链式表的堆栈 class Stack { public: // 构造过程中初始化为空堆栈 Stack (void) : m_top (NULL) {} // 析构过程中销毁剩余的节点 ~Stack (void) { for (Node* next; m_top; m_top = next) { next = m_top->m_next; delete m_top; } } // 压入 void push (int data) { /* Node* node = new Node; node->m_data = data; node->m_next = m_top; m_top = node;*/ m_top = new Node (data, m_top); } // 弹出 int pop (void) { if (empty ()) throw UnderFlow (); int data = m_top->m_data; Node* next = m_top->m_next; delete m_top; m_top = next; return data; } // 判空 bool empty (void) const { return ! m_top; } private: // 下溢异常 class UnderFlow : public exception { const char* what (void) const throw () { return "堆栈下溢!"; } }; // 节点 class Node { public: Node (int data = 0, Node* next = NULL) : m_data (data), m_next (next) {} int m_data; // 数据 Node* m_next; // 后指针 }; Node* m_top; // 栈顶 }; #endif // _LSTACK_H
实现的队列:
squeue.cpp
#include <iostream> #include "lstack.h" using namespace std; // 基于堆栈的队列 class Queue { public: // 压入 void push (int data) { m_i.push (data); } // 弹出 int pop (void) { if (m_o.empty ()) { if (m_i.empty ()) throw underflow_error("队列下溢!"); while (! m_i.empty ()) m_o.push (m_i.pop ()); } return m_o.pop (); } // 判空 bool empty (void) const { return m_i.empty () && m_o.empty (); } private: Stack m_i; // 输入栈 Stack m_o; // 输出栈 }; int main (void) { try { Queue queue; for (int i = 0; i < 10; ++i) queue.push (i); cout << queue.pop () << endl; // 0 cout << queue.pop () << endl; // 1 cout << queue.pop () << endl; // 2 cout << queue.pop () << endl; // 3 cout << queue.pop () << endl; // 4 queue.push (10); queue.push (11); queue.push (12); while (! queue.empty ()) cout << queue.pop () << endl; } catch (exception& ex) { cout << ex.what () << endl; return -1; } return 0; }
标签:栈
原文地址:http://blog.csdn.net/liyuan_669/article/details/39298869