小言_互联网的博客

C#上机练习(2)顺序栈的基本操作

332人阅读  评论(0)





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.详细程序清单;(每一个基本运算都应有注释)

核心代码

  1. 判断栈是否为空
public bool StackEmpty()    //若栈顶指针top为-1表示空栈
{
   
	return (top == -1);
}
  1. 进栈
public bool Push(string x)  //在栈不满的条件下,先将栈顶指针增1,然后在该位置上插入元素e
{
   
	if (top==MaxSize-1) //栈上溢出时,返回false
	{
   
		return false;
	}
	top++;          //栈顶指针增1
	data[top] = x;
	return true;
}
  1. 出栈
public bool Pop(ref string e)   //在出栈运算中,在栈不为空的条件下,先将栈顶元素赋值给1
{
   
	if (StackEmpty())   //栈下溢出时,返回false
	{
   
		return false;
	}
	e = data[top];  //取栈顶指针位置的元素
	top--;          //栈顶指针减1
	return true;
}
  1. 取栈顶元素
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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场