棧:一個模板定長陣列棧
阿新 • • 發佈:2018-11-20
一個模板定長陣列棧
為了以後方便使用,可以把程式碼放在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;
}
演示結果如圖所示
關於清空棧的操作:
每一個記憶體地址中都有值,賦值並不是給沒有值的記憶體賦一個值而是用當前值覆蓋以前的值,所以清空棧並不需要更改原來記憶體的值,只需要更改棧的長度和棧頂,記憶體中的值可以在後續的操作中覆蓋。