在不用容器的基础上模拟了一个链栈:
- #include <iostream>
- #include <assert.h>
- #include <string>
- using namespace std;
- template <typename T>
- class Node
- {
- public:
- Node():next(0){}
- Node(const T& val):elem(val),next(0){}
- //private:
- T elem;
- Node *next;
- };
- template <typename T>
- class stack
- {
- public:
- typedef T value_type;
- typedef size_t size_type;
- stack():Top(0),Base(0),Size(0){}
- bool empty()
- {
- return (Top == 0);
- }
- size_type size();
- value_type& top();
- const value_type& top() const;
- void push(const value_type& elem);
- void pop();
- bool Eq(const stack<T>& rhs)const;
- bool Lt(const stack<T>& rhs)const;
- protected:
- Node<T> *Top; //栈顶指针,指向最后一个节点。
- Node<T> *Base; //栈底指针,指向第一个节点。
- size_t Size; //栈的大小
- };
- template <typename T>
- typename stack<T>::size_type stack<T>::size()
- {
- return Size;
- }
- template <typename T>
- typename stack<T>::value_type& stack<T>::top()
- {
- if (empty())
- {
- throw out_of_range("stack<>::top------stack empty.");
- }
- return Top->elem;
- }
- template <typename T>
- const typename stack<T>::value_type& stack<T>::top() const
- {
- if (empty())
- {
- throw out_of_range("stack<>::top------stack empty.");
- }
- return Top->elem;
- }
- template <typename T>
- void stack<T>::push(const value_type& elem)
- {
- Node<T> *p = new Node<T>(elem);
- if (empty())
- {
- Top = p;
- Base = Top;
- }
- else
- {
- Top->next = p;
- }
- p->next = NULL;
- Top = p;
- ++Size;
- }
- template <typename T>
- void stack<T>::pop()
- {
- if (empty())
- {
- throw out_of_range("stack<>::pop------stack empty.");
- }
- Node<T> *q = Base;
- while (q->next != Top)
- {
- q = q->next;
- }
- Node<T> *h = Top;
- Top = q;
- q->next = NULL;
- delete h;
- --Size;
- }
- template <typename T>
- bool stack<T>::Eq(const stack<T>& rhs)const
- {
- if (Size != rhs.Size)
- {
- return false;
- }
- else
- {
- Node<T> *p = Base;
- Node<T> *q = rhs.Base;
- while ((p->elem == q->elem) && (p != Top))
- {
- p = p->next;
- q = q->next;
- }
- if ((p == Top) && (q = rhs.Top) && (p->elem == q->elem))
- {
- return true;
- }
- return false;
- }
- }
- template <typename T>
- bool stack<T>::Lt(const stack<T>& rhs)const
- {
- if (Size != rhs.Size)
- {
- return (lhs.Size < rhs.Size);
- }
- else
- {
- Node<T> *p = Base;
- Node<T> *q = rhs.Base;
- while (p->elem == q->elem)
- {
- ++p;
- ++q;
- }
- if ((p == Top) && (q = rhs.Top) )
- {
- return false;
- }
- else if (p == Top)
- {
- return true;
- }
- else if(q == rhs.Top)
- {
- return false;
- }
- return (elem < rhs.elem);
- }
- }
- template <typename T>
- bool operator == (const stack<T>& lhs,const stack<T>& rhs)
- {
- return lhs.Eq(rhs);
- }
- template <typename T>
- inline bool operator != (const stack<T>& lhs,const stack<T>& rhs)
- {
- return !(lhs == rhs);
- }
- template <typename T>
- bool operator < (const stack<T>& lhs,const stack<T>& rhs)
- {
- return lhs.Lt(rhs);
- }
- template <typename T>
- bool operator > (const stack<T>& lhs,const stack<T>& rhs)
- {
- return (rhs < lhs);
- }
- template <typename T>
- bool operator <= (const stack<T>& lhs,const stack<T>& rhs)
- {
- return !(lhs > rhs);
- }
- template <typename T>
- bool operator >= (const stack<T>& lhs,const stack<T>& rhs)
- {
- return !(lhs < rhs);
- }
- int main()
- {
- try
- {
- stack<int> mystack1,mystack3;
- mystack1.push(3);
- assert(mystack1 != mystack3);
- cout << mystack1.top() << endl;
- mystack1.push(4);
- cout << mystack1.top() << endl;
- mystack1.push(5);
- cout << mystack1.top() << endl;
- mystack1.pop();
- cout << mystack1.top() << endl;
- mystack1.push(6);
- cout << mystack1.top() << endl;
- cout << mystack1.size() << endl;
- stack<string> mystack2;
- mystack2.push("hello");
- cout << mystack2.top() << endl;
- mystack2.push("world");
- cout << mystack2.top() << endl;
- cout << mystack2.size() << endl;
- }
- catch(const exception& ex)
- {
- cerr << ex.what() << endl;
- }
- system("pause");
- return 0;
- }