头文件:
#include <iostream>
using std::cout;
using std::endl;
using std::cin;
#pragma once
template<typename T>
class Stack{
public:
Stack(void);
~Stack(void);
private:
T* arr;
static const int EVERY_SIZE = 100;
int capacity;
int top;
void applyNewCapacity();
public:
void push(T element);
T topE();
T pop();
void printStack();
int size(){return top+1;}
};
实现文件:
#include "Stack.h"
template<typename T>
Stack<T>::Stack(void):capacity(0),top(-1),arr(NULL){
}
template<typename T>
void Stack<T>::applyNewCapacity(){
T* newArr = (T*)malloc((capacity+EVERY_SIZE)*sizeof(T));
memset(newArr,0,(capacity+EVERY_SIZE)*sizeof(T));
if(arr){
memcpy(newArr,arr,capacity*sizeof(T));
free(arr);
}
arr = newArr;
capacity+= EVERY_SIZE;
}
template<typename T>
Stack<T>::~Stack(void){
if(arr) free(arr);
}
template<typename T>
void Stack<T>::push(T element){
if(++top >= capacity){
this->applyNewCapacity();
}
arr[top] = element;
}
template<typename T>
T Stack<T>::topE(){
if(top<0){
cout<<"under flow"<<endl;
return NULL;
}
return arr[top];
}
template<typename T>
T Stack<T>::pop(){
if(top<0){
cout<<"under flow"<<endl;
return NULL;
}
T temp = arr[top--];
return temp;
}
template<typename T>
void Stack<T>::printStack(){//from top to btm
for(int i=top; i>=0; i--){
cout<<arr[i]<<endl;
}
}
void main(){
Stack<int> st;
st.push(23);
st.push(54);
st.push(123);
st.printStack();
int top = st.topE();
cout <<"top "<<top<<endl;
int pop = st.pop();
cout <<"pop: "<<pop<<endl;
st.printStack();
cin.get();
}