当前位置:编程学习 > C/C++ >>

Customized version of Stack C++(自定义版本)

 
[cpp]  
#ifndef  stack_  
#define stack_  
  
#include "stdafx.h"  
//#include <iostream>  
  
//using namespace std;  
  
//exception  
class OutOfBounds{  
public:  
    OutOfBounds(){}  
};  
  
//change array's size  
template<class T>  
void Changesize1D(T * &arr,const int& size,const int& ToSize){  
      T* tmp = new T[size];  
      tmp = arr;  
      arr = new T[ToSize];  
      for(int i=0; i< size; ++i){  
      arr[i] = tmp[i];  
      }  
      delete[] tmp;  
}  
  
template <class T>  
class Stack{  
    //friend ostream& operator<<(ostream&, const Stack<T>&);  
public:  
    Stack();  
    ~Stack(){delete []stack;};  
    T Top() const;  
    void Pop();  
    void Push(const T& x);  
    int Size() const;  
    bool Empty();  
  
private:  
    int top;  
    int Maxtop;  
    T* stack;  
};  
  
template <class T>  
Stack<T>::Stack() {  
    stack = new T[1];  
    top = -1;  
    Maxtop = 0;  
}  
  
template <class T>  
T Stack<T>::Top() const{  
    if(top == -1){  
        throw OutOfBounds();  
    }else{  
        return stack[top];  
    }  
}  
  
template <class T>  
void Stack<T>::Pop(){  
    --top;  
    //change array capacity when the list size drops to    
    //one-fourth of the array capacity  
    if((top + 1 <= (Maxtop + 1)/4) && Maxtop >0){  
        Maxtop = (Maxtop - 1)/2;  
        Changesize1D(stack,top + 1, Maxtop + 1);  
    }  
}  
  
template <class T>  
void Stack<T>::Push(const T& x){  
    //if there is not enough space to accommodate the new element,  
    //double the array capacity  
    if(top == Maxtop){  
        Maxtop = Maxtop * 2 + 1;  
        Changesize1D(stack,top + 1,Maxtop + 1);  
    }  
    stack[++top] = x;  
      
      
}  
  
template <class T>  
int Stack<T>::Size() const{  
    return top + 1;  
};  
  
template <class T>  
bool Stack<T>::Empty(){  
   return top == -1;  
}  
  
/* 
template <class T> 
ostream& operator<<(ostream& out, const Stack<T>& s){ 
    out << "The stack has " << s.Size() << " element(s)" << endl; 
 
    return out; 
}*/  
#endif  
 
Test it
 
[cpp]  
// Stack.cpp : Defines the entry point for the console application.  
//  
  
#include "stdafx.h"  
#include "Stack1.h"  
#include <iostream>  
using namespace std;  
  
  
int main(int argc, char* argv[])  
{  
  
  
    Stack<int> t;  
    try  
    {  
        t.Top();  
    }  
    catch (OutOfBounds e)  
    {  
        cout << "no element" << endl;  
    }     
           
    t.Push(1);  
    cout << "after push 1, the top:" << t.Top() << endl;  
    cout << "after push 1, is empty?:" <<t.Empty() << endl;  
    t.Pop();  
    cout << "after pop, is empty? " <<t.Empty() << endl;  
    for(int i=0; i<10; ++i){  
        t.Push(i);  
    }  
    while(!t.Empty()){  
        cout << t.Top() << endl;  
        t.Pop();  
    }  
    return 0;  
}  
 

补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,