




1.上機目的
(1)掌握堆疊的順序存盤結構表示和實作方法,
(2)掌握順序堆疊的入堆疊和出堆疊等基本操作演算法實作,
(3)了解堆疊在解決實際問題中的簡單應用,
2.上機內容
利用順序堆疊的基本操作實作將任意一個十進制整數轉化為R進制(二進制、八進制)整數,主要包括:
(1)定義堆疊的順序存取結構
(2)分別定義堆疊的基本操作(初始化堆疊、判堆疊為空、出堆疊、入堆疊等)
(3)定義一個函式來解決上面問題:
-
十進制整數X和R作為形參
-
初始化堆疊
-
只要X不為0重復做下列動作
將X%R入堆疊
X=X/R -
只要堆疊不為空重復做下列動作
堆疊頂出堆疊
輸出堆疊頂元素
3. 資料結構描述;(所用存盤結構的C#描述)
堆疊(stack)又名堆疊,它是一種運算受限的線性表,限定僅在表尾進行插入和洗掉操作的線性表,這一端被稱為堆疊頂,相對地,把另一端稱為堆疊底,向一個堆疊插入新元素又稱作進堆疊、入堆疊或壓堆疊,它是把新元素放到堆疊頂元素的上面,使之成為新的堆疊頂元素;從一個堆疊洗掉元素又稱作出堆疊或退堆疊,它是把堆疊頂元素洗掉掉,使其相鄰的元素成為新的堆疊頂元素,
要搞清楚這個概念,首先要明白”堆疊“原來的意思,如此才能把握本質,堆疊,存盤貨物或供旅客住宿的地方,可引申為倉庫、中轉站,所以引入到計算機領域里,就是指資料暫時存盤的地方,所以才有進堆疊、出堆疊的說法,
堆疊作為一種資料結構,是一種只能在一端進行插入和洗掉操作的特殊線性表,它按照先進后出的原則存盤資料,先進入的資料被壓入堆疊底,最后的資料在堆疊頂,需要讀資料的時候從堆疊頂開始彈出資料(最后一個資料被第一個讀出來),堆疊具有記憶作用,對堆疊的插入與洗掉操作中,不需要改變堆疊底指標,
順序堆疊定義如下
class SqStackClass
{
const int MaxSize = 100;
public string[] data;
public int top;
public SqStackClass()
{
data = new string[MaxSize];
top = -1;
}
}
定義介面
public interface IStackDS //定義介面
{
bool StackEmpty(); // 判斷堆疊是否為空,若空堆疊,回傳真,否則回傳假,
bool Push(string e); // 進堆疊,將元素e插入到堆疊中作為堆疊頂元素,
bool Pop(ref string e); // 出堆疊,從堆疊中退出堆疊頂元素,并將其賦值給e,
bool GetTop(ref string e); // 取堆疊頂元素,回傳當前的堆疊頂元素,并將其賦值給e
}
4.詳細程式清單;(每一個基本運算都應有注釋)
核心代碼
- 判斷堆疊是否為空
public bool StackEmpty() //若堆疊頂指標top為-1表示空堆疊
{
return (top == -1);
}
- 進堆疊
public bool Push(string x) //在堆疊不滿的條件下,先將堆疊頂指標增1,然后在該位置上插入元素e
{
if (top==MaxSize-1) //堆疊上溢位時,回傳false
{
return false;
}
top++; //堆疊頂指標增1
data[top] = x;
return true;
}
- 出堆疊
public bool Pop(ref string e) //在出堆疊運算中,在堆疊不為空的條件下,先將堆疊頂元素賦值給1
{
if (StackEmpty()) //堆疊下溢位時,回傳false
{
return false;
}
e = data[top]; //取堆疊頂指標位置的元素
top--; //堆疊頂指標減1
return true;
}
- 取堆疊頂元素
public bool GetTop(ref string e) //在堆疊不為空的情況下,將堆疊頂元素賦值給e,不移動堆疊頂指標
{
if (StackEmpty()) //堆疊為空的情況下,即堆疊下溢位
{
return false;
}
e = data[top]; //取堆疊頂指標位置的元素
return true;
}
完整代碼
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 資料結構_堆疊_
{
public interface IStackDS //定義介面
{
bool StackEmpty(); // 判斷堆疊是否為空,若空堆疊,回傳真,否則回傳假,
bool Push(string e); // 進堆疊,將元素e插入到堆疊中作為堆疊頂元素,
bool Pop(ref string e); // 出堆疊,從堆疊中退出堆疊頂元素,并將其賦值給e,
bool GetTop(ref string e); // 取堆疊頂元素,回傳當前的堆疊頂元素,并將其賦值給e
}
public class SqStackClass:IStackDS
{
const int MaxSize = 100; //堆疊中的最多元素個數及堆疊的大小
public string[] data; //存放堆疊中的元素
public int top; //堆疊頂指標
public SqStackClass() //建構式,用于堆疊初始化
{
data = new string[MaxSize];
top = -1;
}
public bool StackEmpty() //若堆疊頂指標top為-1表示空堆疊
{
return (top == -1);
}
public bool Push(string x) //在堆疊不滿的條件下,先將堆疊頂指標增1,然后在該位置上插入元素e
{
if (top==MaxSize-1) //堆疊上溢位時,回傳false
{
return false;
}
top++; //堆疊頂指標增1
data[top] = x;
return true;
}
public bool Pop(ref string e) //在出堆疊運算中,在堆疊不為空的條件下,先將堆疊頂元素賦值給1
{
if (StackEmpty()) //堆疊下溢位時,回傳false
{
return false;
}
e = data[top]; //取堆疊頂指標位置的元素
top--; //堆疊頂指標減1
return true;
}
public bool GetTop(ref string e) //在堆疊不為空的情況下,將堆疊頂元素賦值給e,不移動堆疊頂指標
{
if (StackEmpty()) //堆疊為空的情況下,即堆疊下溢位
{
return false;
}
e = data[top]; //取堆疊頂指標位置的元素
return true;
}
}
}
控制元件系結
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace 資料結構_堆疊_
{
public partial class Form1 : Form
{
string mystring = null;//全域變數,用來存放出堆疊元素
int r; //全域變數,存盤進制
SqStackClass p; // 定義堆疊物件
public Form1()
{
InitializeComponent();
btnPop.Enabled = false;
btnGetTop.Enabled = false;
}
public void myFunction(int X,int R) //自定義方法
{
if (p.StackEmpty()) //如果堆疊為空,執行以下操作
{
string str=""; //區域變數,存盤入堆疊操作程序
string displaystring = ""; //顯示所有入堆疊元素
btnPop.Enabled = true; //激活控制元件
btnGetTop.Enabled = true;
while (X != 0) //如果X不為0重復做下列動作 1、將X%R入堆疊 2、X = X / R
{
string mystr = (X % R).ToString(); //取堆疊元素,并轉換為字符
txtOperProcess.Text = mystr;
X = X / R;
p.Push(mystr);
str += "元素" + mystr + "進堆疊" + Environment.NewLine;
displaystring += mystr + " ";
}
txtOperProcess.Text = str+"*****完畢*****";
txtDisplay.Text = displaystring;
}
}
#region 入堆疊按鈕
private void btnPush_Click(object sender, EventArgs e)
{
txtPopElement.Clear(); //清空文本框
txtTopElement.Clear();
p = new SqStackClass(); //實體化堆疊物件
mystring = null;
r = rbtnTwo.Checked == true ? 2 : 8; //進制判斷
if (r == 2) rbtnTwo.Checked = true;
else rbtnEight.Checked = true;
myFunction(int.Parse(txtNumber.Text), r); //執行自定義方法,完成入堆疊
}
#endregion
#region 出堆疊按鈕
private void btnPop_Click(object sender, EventArgs e)
{
string str = null;
if (p.Pop(ref str))
{
mystring += str + " ";
}
else
{
mystring = "出堆疊完畢";
}
txtPopElement.Text = mystring;
}
#endregion
#region 堆疊頂元素
private void btnGetTop_Click(object sender, EventArgs e)
{
string str = null;
if (p.GetTop(ref str))
{
txtTopElement.Text = str;
}
else
{
txtTopElement.Text = "空";
}
}
#endregion
}
}
程式運行結果



轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/279985.html
標籤:其他
下一篇:型別專題
