Stack.h中聲明瞭Stack類,在Stack.cpp中進行了定義
Stack的私有成員包括data指針,指向棧,tot指的是開闢總的空間,pointer指向類裏面元素的位置
Stack有兩個構造函數:不傳參開闢大小爲10的數組,傳參按照參數開闢數組
Stack有兩個狀態函數判斷棧是否爲空或滿(empty() full())
Stack功能:
push:未滿存入目標元素,滿了開闢兩倍大小的數組再存入目標元素
pop:棧爲空直接退出,否則拋棄棧頂元素
get():用於得到第i個元素,缺省爲0
size():得到棧元素總數
[]重載:得到下標元素的值
print函數輸出棧內所有元素,從棧底開始
Stack.h
#ifndef Stack_h
#define Stack_h
template <typename T>
class Stack
{
T* data;
int tot; //開闢空間總數
int pointer; //指針指向當前位置
public:
Stack();
Stack (int cnt);
T pop();
T get(int i = 0); //缺省值爲0
void push(const T &i);
bool empty() //判斷棧是否爲空
{
return (pointer == 0);
}
bool full() //判斷棧是否已滿
{
return pointer == tot;
}
int size();
T& operator[] (int i); //運算符重載
void print();
~Stack();
};
#endif /* Stack_h */
Stack.cpp
#include "Stack.h"
#include <iostream>
#include <cstring>
using namespace std;
template <typename T>
void Stack<T> :: print() //輸出當前棧內所有元素
{
for (int i = 0; i < pointer; i++)
cout << data[i];
cout << endl;
}
template <typename T>
Stack<T> :: Stack() : tot(10), pointer(0) //不帶參數的構造函數
{
data = new T[tot];
}
template <typename T>
T Stack<T> :: get(int i) //帶參數的構造函數
{
return data[pointer - 1 - i];
}
template <typename T>
void Stack<T> :: push(const T &i)
{
if (!full())
{
data[pointer] = i;
pointer++;
}
else //滿了開闢兩倍空間並複製原來的元素最後還複製回data
{
T* _data = new T[tot * 2];
for (int k = 0; k < tot; k++)
_data[k] = data[k];
delete[] data;
data = _data;
data[pointer] = i;
pointer++;
tot *= 2;
}
}
template <typename T>
T Stack<T> :: pop()
{
if (empty()) //如果爲空什麼也不做
return -1;
T tep = data[pointer-1];
pointer--;
return tep;
}
template <typename T>
T& Stack<T> :: operator[] (int i)
{
return data[pointer - i - 1];
}
template <typename T>
int Stack<T> :: size()
{
return pointer;
}
template <typename T>
Stack<T> :: Stack (int cnt) : tot(cnt), pointer(0) { data = new T[tot]; }
template <typename T>
Stack<T> :: ~Stack() { delete[] data; }
smain.cpp
#include <iostream>
#include <string>
#include "Stack.h"
#include "Stack.cpp"
using namespace std;
int main()
{
Stack<int> obj1; //int型對象
Stack<int> obj2;
obj2.pop(); //obj2爲空,什麼都不做
for (int i = 0; i < 200; i++)
obj1.push(i);
cout << "obj1[0] = " << obj1[0] << endl;
cout << "obj1.size() = " << obj1.size() << endl;
cout << obj1.get(2) << endl;
obj1.pop();
cout << "obj1.size() = " << obj1.size() << endl;
cout << obj1.get() << endl;
cout << obj1.get(3) << endl;
Stack<char> obj3; //創建存儲char型的
for (int i = 0; i < 20; i++)
obj3.push('A' + i);
cout << "obj3.size() = " << obj3.size() << endl;
cout << "obj3[0] = " << obj3[0] << endl;
cout << obj3.get() << endl;
cout << obj3.get(2) << endl;
obj3.pop();
cout << "obj3.size() = " << obj3.size() << endl;
Stack<char> obj4(5);
obj4.push('H');
obj4.push('e');
obj4.push('l');
obj4.push('l');
obj4.push('o');
obj4.print();
for(int i = 4; i >= 0; i--)
cout << obj4[i];
cout << endl;
return 0;
}
smain函數的測試
兩個不帶參數的int型對象obj1,obj2。obj2沒有push任何元素,pop()失敗。obj2將0~199push進去並進行下面的測試
測試[]
測試size()
測試get(2)
測試pop刪除
再次測試size()
測試get() 默認爲第0個
測試get(3)
char型的obj3從A開始按順序push了20個大寫字母
測試size
測試[]
測試get() 默認第0個
測試get(2)
測試pop
再次測試size
char型的obj4(5) (指定開闢空間爲5)push了H e l l o
測試print函數
測試obj4[]
最後輸出爲:
obj1[0] = 199
obj1.size() = 200
197
obj1.size() = 199
198
195
obj3.size() = 20
obj3[0] = T
T
R
obj3.size() = 19
Hello