1. 程式人生 > >《資料結構》實驗三:棧和佇列實驗

《資料結構》實驗三:棧和佇列實驗

《資料結構》實驗三:    棧和佇列實驗

一..實驗目的

     鞏固棧和佇列資料結構,學會運用棧和佇列。

1.回顧棧和佇列的邏輯結構和受限操作特點,棧和佇列的物理儲存結構和常見操作。

2.學習運用棧和佇列的知識來解決實際問題。

3.進一步鞏固程式除錯方法。

4.進一步鞏固模板程式設計。

二.實驗時間

   準備時間為第5周到第6周,具體集中實驗時間為6周第2次課。2個學時。

三..實驗內容

1.自己選擇順序或鏈式儲存結構,定義一個空棧類,並定義入棧、出棧、取棧元素基本操作。然後在主程式中對給定的N個數據進行驗證,輸出各個操作結果。

2.自己選擇順序或鏈式儲存結構,定義一個空棧佇列,並定義入棧、出棧、取棧元素基本操作。然後在主程式中對給定的N個數據進行驗證,輸出各個操作結果。

3.程式設計實現一個十進位制數轉換成二進位制數。要求,要主程式中輸出一個10進度數,輸出其對應的2進位制數序列。

    前兩題是必做題,第3題是選做題。

順序棧

#include<iostream>
using namespace std;
const int stacksize=10;
template<class T>
class Seqstack
{
	public:
		Seqstack(){top=-1;}
		~Seqstack(){}
		void ruz(T x);
		T chuz();
		T quzd();
		int empty();
	private:
		T data[stacksize];
		int top;
};

template<class T>
void Seqstack<T>::ruz(T x)
{
	if(top==stacksize-1)throw"上溢錯誤";
	top++;
	data[top]=x;
}

template<class T>
T Seqstack<T>::chuz()
{
	T x;
	if(top==-1)throw"下溢錯誤";
	x=data[top--];
	return x;
}

template<class T>
T Seqstack<T>::quzd()
{
	if(top!=-1)
		return data[top];
}

template<class T>
int Seqstack<T>::empty()
{
	if(top==-1)
		return 1;
	else
		return 0;
}

void main()
{
	Seqstack<int> z;
	if(z.empty())
		cout<<"此棧為空!"<<endl;
	else
		cout<<"此棧為非空!"<<endl;
	cout<<"1,2,3,4,5依次入棧!"<<endl;
	z.ruz(1); z.ruz(2); z.ruz(3);
	z.ruz(4); z.ruz(5);
	cout<<"此棧的棧頂元素是:";
	cout<<z.quzd()<<endl;
	cout<<"執行一次出棧操作!"<<endl;
	z.chuz();
	cout<<"現在的棧頂元素是:";
    cout<<z.quzd()<<endl;
	cout<<"再執行一次出棧操作!"<<endl;
	z.chuz();
	cout<<"現在棧頂元素是:";
	cout<<z.quzd()<<endl;
}


截圖

鏈佇列

#include<iostream>
using namespace std;
template<class T>
struct node
{
	T data;
	node<T> *next;
};
template<class T>
class Linkqueue
{
	public:
		Linkqueue();
		~Linkqueue();
		void rud(T x);
		T chud();
		T qudt();
		int empty();
	private:
		node<T> *front,*rear;
};

template<class T>
Linkqueue<T>::Linkqueue()
{
	node<T> *r=NULL;
	r=new node<T>;
	r->next=NULL;
	front=rear=r;
}

template<class T>
Linkqueue<T>::~Linkqueue()
{
	node<T> *p=NULL;
	while(front!=NULL)
	{
		p=front->next;
		delete front;
		front=p;
	}
}

template<class T>
void Linkqueue<T>::rud(T x)
{
	node<T> *s=NULL;
	s=new node<T>;
	s->data=x;  s->next=NULL;
	rear->next=s;  rear=s;
}

template<class T>
T Linkqueue<T>::chud()
{
	node<T> *p=NULL;  int x;
	if(rear==front)throw "下溢錯誤";
	p=front->next;  x=p->data;
	front->next=p->next;
	if(p->next==NULL) rear=front;
	delete p;
	return x;
}

template<class T>
T Linkqueue<T>::qudt()
{
	if(front!=rear)
		return front->next->data;
}

template<class T>
int Linkqueue<T>::empty()
{
	if(front==rear)
		return 1;
	else
		return 0;
}

void main()
{
	Linkqueue<int> d;
	if(d.empty())
		cout<<"此佇列為空!"<<endl;
	else
		cout<<"此佇列為非空!"<<endl;
	cout<<"10,20,30依次入隊!"<<endl;
		try
	{
		d.rud(10);  d.rud(20);  d.rud(30);
	}
	catch(char *w)
	{
		cout<<w<<endl;
	}
	cout<<"此佇列的隊頭元素是:";
	cout<<d.qudt()<<endl;
	cout<<"執行一次出隊操作!"<<endl;
	try
	{
		d.chud();
	}
	catch(char *w)
	{
		cout<<w<<endl;
	}
	cout<<"現在的隊頭元素是:";
		cout<<d.qudt()<<endl;
}



截圖

比較總結棧和佇列

         棧只能在一端進行插入和刪除操作,即後入棧的先出棧。棧有時候可能造成空間的浪費,所以有兩棧共享空間,要定義兩個棧頂指標。

         佇列只允許在一端進行插入操作,在另一端進行刪除操作,所以先入隊的也先出隊。佇列有一個重點,就是判斷隊空和隊滿的條件。

         棧和佇列都是受限制的線性表。