1. 程式人生 > >棧:一個模板定長陣列棧

棧:一個模板定長陣列棧

一個模板定長陣列棧

        為了以後方便使用,可以把程式碼放在Stack.h檔案中。

#include<iostream>
using namespace std;
template<class T>
class Stack
{
public:
    Stack(int Size);
    ~Stack();
    bool stack_empty();//判空
    bool stack_full();//判滿
    bool push(T element);
//入棧 bool pop(T &element);//出棧 void stack_clear();//清空棧 void traverse();//遍歷 private: T* data; int Size; int lenght; int top; }; //初始化棧 template<class T> Stack<T>::Stack(int Size) { this->Size=Size; data=new T[Size]; lenght=0; top=0; } //銷燬棧 template<
class T> Stack<T>::~Stack() { delete []data; } //判空 template<class T> bool Stack<T>::stack_empty() { return top==0?true:false; } //判滿 template<class T> bool Stack<T>::stack_full() { return top==Size?true:false; } //入棧 template<class T> bool Stack<T>
::push(T element) { if(stack_full()) return false; data[top]=element; top++; lenght++; return true; } //出棧 template<class T> bool Stack<T>::pop(T &element)//傳入引用的目的是可以把出棧的元素取出來,相當於取棧首元素 { if(stack_empty()) return false; top--; element=data[top]; lenght--; return true; } //清空棧 template<class T> void Stack<T>::stack_clear() { //將棧的長度清0,棧頂指向0; lenght=0; top=0; } //遍歷棧 template<class T> void Stack<T>::traverse() { for(int i=0;i<top;i++) cout<<data[i]<<" "; cout<<endl; }

          可以把上述檔案引入主檔案中進行操作。
          這是一個簡單的小演示

#include <iostream>
#include"Stack.h"
#include<stdlib.h>
using namespace std;

int main()
{
    int Size;//定義棧的長度
    cin>>Size;
    Stack<int> mystack(Size);//在<>中填寫棧中元素的資料型別
    int x;
    for(int i=0;i<Size;i++)
    {
        x=rand()%100;//產生一個100以內隨機數
        mystack.push(x);//將產生的隨機數入棧
    }
    mystack.traverse();//清空棧,未清空前棧內有25個元素,清空後元素為0;
    for(int i=0;i<Size/2;i++)
    {
        mystack.pop(x);//將棧頂元素取出,取出後存入在變數x中,因為傳入的引數是引用
        mystack.traverse();//每取出一個元素列印一遍當前棧
    }
    return 0;
}

演示結果如圖所示
在這裡插入圖片描述
關於清空棧的操作:
每一個記憶體地址中都有值,賦值並不是給沒有值的記憶體賦一個值而是用當前值覆蓋以前的值,所以清空棧並不需要更改原來記憶體的值,只需要更改棧的長度和棧頂,記憶體中的值可以在後續的操作中覆蓋。