c++簡單的棧

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開始按順序push20個大寫字母
測試size
測試[]
測試get() 默認第0個
測試get(2)
測試pop
再次測試size

char型的obj4(5) (指定開闢空間爲5push了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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章