1. 程式人生 > >資料結構|順序棧的實現(實驗3.1)

資料結構|順序棧的實現(實驗3.1)

一、實驗目的

1、熟練掌棧的結構特點,掌握棧的順序儲存結構和實現。

2、學會使用棧解決實際問題。

二、實驗內容

1、自己確定結點的具體資料型別和問題規模,建立一個順序棧,實現棧的壓棧和出棧操作。

三、實驗步驟

1、依據實驗內容分別說明實驗程式中用到的資料型別的定義;

template < typename T >
class SeqStack{
	public:
		SeqStack() {top = -1;}  //建構函式,初始化一個空棧
		~SeqStack() {}   //解構函式為空
		void push(T x);   //入棧操作,將元素x入棧
		T pop();      //出棧操作,將棧頂元素彈出
		T get() { if(top!=-1) return data[top]; }  //取棧頂元素(不刪除)
		bool Empty() { return top == - 1 ? true : false; }  //判斷棧是否為空
		bool Full()  { return top == StackSize - 1 ? true : false; }  //判斷是否棧滿
		void print();  //遍歷操作
	private:  
		T data[StackSize];  //存放棧元素的陣列
		int top;   //棧頂指標,為棧頂元素在陣列中的下標
};

2、相關操作的演算法表達;

  2.1、建構函式,初始化一個空棧

  2.2、入棧操作函式:①.判斷是否棧滿,若是則返回,否則 
              ②.先棧頂指標 top 往上移一位,再在該位儲存資料

  2.3、出棧操作函式:①判斷是否棧空,若是則返回 -1,否則 
              ②先返回棧頂指標 top 指向的位置的值,再把棧頂指標 top 往下移一位

  2.4、輸出操作函式:按照順序,輸出棧元素。

3、完整程式;

由於結點元素型別不確定,因此採用C++模板機制。

原始碼如下:

#include<iostream>
using namespace std;

const int StackSize = 10 ;

template < typename T >
class SeqStack{
	public:
		SeqStack() {top = -1;}  //建構函式,初始化一個空棧
		~SeqStack() {}   //解構函式為空
		void push(T x);   //入棧操作,將元素x入棧
		T pop();      //出棧操作,將棧頂元素彈出
		T get() { if(top!=-1) return data[top]; }  //取棧頂元素(不刪除)
		bool Empty() { return top == - 1 ? true : false; }  //判斷棧是否為空
		bool Full()  { return top == StackSize - 1 ? true : false; }  //判斷是否棧滿
		void print();  //遍歷操作
	private:  
		T data[StackSize];  //存放棧元素的陣列
		int top;   //棧頂指標,為棧頂元素在陣列中的下標
};

template< typename T >
void SeqStack<T>::push(T x)
{
	if(Full()){              //判斷是否棧滿入棧: 
        cout<<"棧滿!"<<endl;  
        return;  
    }
	data[++top] = x; cout<<"入棧"<<x<<"成功!"<<endl;
}

template< typename T >
T SeqStack<T>::pop()
{
	T x;
	if(Empty()){             //判斷是否棧空出棧
 * 1.判斷是否棧空,若是則返回 -1,否則 
 * 2.先返回棧頂指標 top 指向的位置的值,再把棧頂指標 top 往下移一位
        cout<<"棧空!"<<endl;  
        return -1;  
    }
	x = data[top--];
	return x;
}

template< typename T >
void SeqStack<T>::print()
{
	for( int i=0 ; i<=top ; i++)
	{  cout<<data[i]<<" ";}
	cout<<endl;
}

void main()
{
	SeqStack<int>a;
	cout<<"按順序把“1,2,3,4,5”推進棧"<<endl;
	for(int i=1;i<=5;i++) {  a.push(i);  }
	cout<<"結果如下:"<<endl;
	a.print();
	cout<<"出棧一個元素"<<a.pop()<<"結果如下:"<<endl;
	a.print();
	cout<<"現在棧頂元素為:"<<a.get()<<endl;
}

4、總結、執行結果和分析。

①總結

   在程式內定義物件為int型,將元素1~5按順序入棧。

   通過呼叫成員函式,實現入棧、出棧、輸出等基本功能。

②執行結果如下:


5、總體收穫和不足,疑問等。

  本次試驗較為簡單,因為實驗內容較少,且對書本知識掌握得有點熟悉。但本次試驗還是發現了自己的不足之處。經過改進、詢問同學,成功完成了實驗。收穫頗豐。總的來說,我對理論知識有了更充分的理解,也能較大程度明白執行原理。