栈
来源:互联网 发布:设置淘宝域名有什么用 编辑:程序博客网 时间:2024/06/06 08:56
#include <iostream>using namespace std;/* 问题是由于都是值传递,因此当塞入对象的时候内部其实复制了一份对象 因此在原对象上修改的不会在Stack中同样修改 */template<class T>class ArrayStack{private: T* t; int size; int capacity; enum{DEFAULT_SIZE = 5};public: ArrayStack(){t = new T[DEFAULT_SIZE];size = 0;capacity = 5;} virtual ~ArrayStack(){delete[] t;} bool isEmpty(){return size==0?true:false;} void push(T& a); T pop(); void print();private: ArrayStack(const ArrayStack& a){}; ArrayStack& operator=(const ArrayStack& a){} };template<class T>void ArrayStack<T>::push(T& a){ if(size==capacity) { T* temp = new T[2*capacity]; capacity = 2*capacity; for(int i=0;i<size;i++) { temp[i] = t[i]; } delete[] t; t = temp; } t[size++] = a; }template<class T>T ArrayStack<T>::pop(){ if(isEmpty()) throw "Empty Stack"; return t[--size]; }template<class T>void ArrayStack<T>::print(){ for(int i=0;i<size;i++) { cout<<t[i]<<" "; } }int main(){ ArrayStack<int> s; int i=0; while(i++<10) s.push(i); s.print(); cout<<endl; i=0; while(i++<10) cout<<s.pop(); cout<<endl; cout<<s.isEmpty(); cin.get();}
#include <iostream>using namespace std;/* 这个版本和ArrayStack不同, 实际保存的是指向对象的指针, 因此Stack和原始对象只有一份副本 */template<class T>class LinkedStack{private: struct Node //这里应该不要泛型标识 { T* t; Node* next; };private: int size; Node* head;public: LinkedStack(){size=0;head=0;} void push(T& a); T& pop(); void print(); bool isEmpty(); ~LinkedStack();private: LinkedStack(const LinkedStack& s){} LinkedStack& operator=(const LinkedStack&s){} };template<class T>void LinkedStack<T>::push(T& a){ if(!head) { head = new Node; head->t = &a; head->next = 0; }else { Node* p = new Node; p->t = &a; p->next = head; head = p; } size++; }template<class T>T& LinkedStack<T>::pop(){ if(size==0) throw "Empty Stack"; T* p = head->t; Node* temp = head; head = head->next; delete temp; size--; return *p; }template<class T>void LinkedStack<T>::print(){ Node *p = head; while(p) { cout<<*(p->t)<<" "; p = p->next; } }template<class T>bool LinkedStack<T>::isEmpty(){ return size==0?true:false; }template<class T>LinkedStack<T>::~LinkedStack(){ while(head) { Node* p = head; head = head->next; delete p; } }int main(){ LinkedStack<int> s; int i=0; while(i++<10) s.push(i); s.print(); cout<<endl; i=0; while(i++<10) cout<<s.pop(); cout<<endl; cout<<s.isEmpty(); cin.get(); }