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://blog.csdn.net/weixin_46688667/article/details/116082680
查看评论