1、(2)出队列操作:DeQueue();(3)取队头元素:GetFront();(4)求队列的长度;GetLength();(5)判断队列是否为空:IsEmpty();(6)清空操作:Clear();(7)判断是否为满:IsFull();在这个程序中用循环顺序队列;当队尾指示器rear到达数组上限时,如果还有数据元素入队并且数组的第0个空间空闲时,队尾指示器rear指向数组的0端。队尾指示器rear的值不一定大于队头Front的值,并且队满和队空的条件是相同的,为rear=front;2.3类定义(函数定义)在这个程序中,定义了一下及几种类:接口IQueue类:将队列的基本操作定义在接口IQue
2、ue中,如左图所示:Clear:清空操作,是队列为空;DeQueue:出队列操作,将队头元素从队列中取出;EnQueue:入队列操作,将值为elem的新数据元素添加到队尾;GetFront:取队头元素,返回队头元素的值;GetLength:求队列的长度,返回队列中数据元素的个数;IsEmpty:判断队列是否为空,如果对列为控,返回true,否则返回false;IsFull:判断是否为满,如果对列为满返回true,否则返回false;接口IBankQueue类:将银行队列的所有操作定义在里面:GetCallnumber:获取服务号;泛型类CSeqQueue表示顺序队列:(1)、字段字段maxsi
3、ze:表示循环队列的最大容量;字段front:表示对头,范围是0maxsize-1;字段rear:表示队尾,范围也是0maxsize-1;字段data:表示数组用于存储循环顺序队列中的数据 元素;(2)、属性在类中并设置了队头属性(front)、队尾属性(rear)、容量属性(maxsize)、索引器属性(this);(3)、方法在这个类中有接口IQueue中的一切方法;银行叫号顺序队列类CSeqBankQueue类:该类实现IBankQueue接口中定义的全部行为,通过继承CSeqQueue将已实现的全部行为继承过来;此外,设置了一个新来顾客的服务号属性Callnumber;通过方法GetC
4、allnumber()获得服务号;Form1类:Form1继承了系统中的Form类;在Form1中使用了button、label、textBox等控件;使用了button_Click方法实现取号行为;Form2类:Form2也继承了系统中的Form类;在Form2中也使用了button、label、textBox等控件;使用了button_Click方法实现叫号行为;Form3类:Form3也继承了系统中的Form类;Form4类:Form4也继承了系统中的Form类;服务窗口ServiceWindow类:服务队列的属性BankQ;作为线程的方法Service();主程序Main()方法;2.
5、4界面设计在这个程序中,总共设计了四个界面,一个取号界面,三个服务窗口界面:如图所示:1、取号窗口:在取号窗口中,有了三个label控件,设置了“中国银行”、“欢迎你”、“请点击取号”字样,使用button控件设置了取号按钮,用了textBox控件用于显示所取到的排队号码。2、服务窗口一号服务窗口二号服务窗口三号服务窗口在服务窗口中用了两个label控件设置了“中国银行”、“X号服务窗口”字样,用了button控件设置了“下一个”按钮,用textBox显示“请X号到X号服务窗口”;2.5编码namespace 银行排队叫号系统 public partial class Form1 : Form
6、 IBankQueue bankQueue=new CSeqBankQueue(100);/新建一个队列; CSeqQueue q1 = new CSeqQueue(100); int Callnumber;/号码; public Form1() InitializeComponent(); Form2 f1 = new Form2(this.q1);/实例话Form; Form3 f2 = new Form3(this.q1); Form4 f3 = new Form4(this.q1); f1.Show();/使几个窗口同时显示; f2.Show(); f3.Show(); private
7、 void button1_Click(object sender, EventArgs e) if (!bankQueue.IsFull() Callnumber = bankQueue.GetCallnumber(); textBox1.Text = 你的号码是: + Callnumber + 号, + 你前面还有 + bankQueue.GetLength() + 位,请耐心等待!; bankQueue .EnQueue(Callnumber );/所取得的号码进队; q1.EnQueue(Callnumber); else Console .WriteLine (现在业务繁忙,请稍后再
8、来!); Console .WriteLine (); public partial class Form3 : _q1 = new CSeqQueue public Form3(CSeqQueue q1)/构造函数,应用Form1所建立的队列; this._q1 = q1;_q1.IsEmpty() textBox1.Text = (请 + _q1.DeQueue() + 号到二号窗口! MessageBox.Show(现在没有客人!2.6测试代码编写完成后,执行调试-开始执行,看是否能成功生成,若能的话,点击取号看服务窗口是否按要求运作;若不能的话,根据所提供的错误提示,一步步的调试,直到
9、成功生成为止。下图为取到八号,且六号正在被服务时各显示器上的显示:三、总结在整个过程中,应该注意以下几点:1.要求利用面向对象的方法以及队列数据结构来完成系统的设计;2. 在设计的过程中,建立清晰的类层次;3. 在系统设计中要分析和定义各个类,每个类中要有各自的属性和方法;4. 要运用面向对象的机制来实现系统功能。通过对完成这次课程设计,加深了对队列这种数据结构的理解,掌握了队列数据结构极其算法;此外也能够更加熟练的使用button。Label。textBox等控件。参考文献雷军环、邓文达、刘震编著 数据结构(C#语言版)钱哨、李挥剑、李继哲编著 C#WinForm实践开发教程郑宇军编著 C#
10、面向对象程序设计附录:源代码IQueue接口代码:using System;namespace QueueDs interface IQueue void EnQueue(T elem); /入队列操作 T DeQueue(); /出队列操作 T GetFront(); /取对头元素 int GetLength(); /求队列的长度 bool IsEmpty(); /判断队列是否为空 void Clear(); /清空队列 bool IsFull();/判断是否为满,在顺序队列中实现该算法,在链式队列中代码实现为空IBankQueue接口代码: interface IBankQueue:IQu
11、eue int GetCallnumber();/获得服务号码顺序队列代码: public class CSeqQueue: private int maxsize; /循环顺序队列的容量 private T data; /数组,用于存储循环顺序队列中的数据元素 private int front; /指示最近一个己经离开队列的元素所占的位置 private int rear; /指示最近一个进行入队列的元素的位置 /索引器 public T thisint index get return dataindex; set dataindex = value; /容量属性 public int
12、Maxsize return maxsize; maxsize = value; /队头指示器属性 public int Front return front; front = value; /队尾指示器属性 public int Rear return rear; rear = value; /初始化队列 public CSeqQueue() public CSeqQueue(int size) data = new Tsize; maxsize = size; front = rear = -1; /入队操作 public void EnQueue(T elem) if (IsFull()
13、 Console.WriteLine(Queue is full return; rear=(rear + 1) % maxsize; ; datarear = elem; /出队操作 public T DeQueue() if (IsEmpty()Queue is empty return default(T); front = (front + 1) % maxsize; return datafront; /获取队头数据元素 public T GetFront()Queue is empty! return data(front+1)%maxsize; /求循环顺序队列的长度 publi
14、c int GetLength() return (rear - front + maxsize) % maxsize; /判断循环顺序队列是否为满 public bool IsFull() if (front = -1 & rear = maxsize - 1) | (rear + 1) % maxsize = front) return true; return false; /清空循环顺序队列 public void Clear() /判断循环顺序队列是否为空 public bool IsEmpty() if (front = rear)银行顺序队列代码:using System.Thr
15、eading; /银行叫号顺序队列类 class CSeqBankQueue:CSeqQueue,IBankQueue private int callnumber;/记录系统自动产生的新来顾客的服务号 /叫号属性 public int Callnumber return callnumber; callnumber = value; public CSeqBankQueue () public CSeqBankQueue(int size):base(size) /获得服务号码 public int GetCallnumber() if (IsEmpty() & callnumber = 0
16、) callnumber = 1; callnumber+; /服务窗口类 class ServiceWindow IBankQueue bankQ; public IBankQueue BankQ return bankQ; bankQ = value; public void Service() while (true) Thread.Sleep(10000);bankQ.IsEmpty() Console.WriteLine(); lock (bankQ)请0号到1号窗口!, bankQ.DeQueue(), Thread.CurrentThread.Name);Form1代码using
17、 System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using QueueDs; private void Form1_Load(object sender, EventArgs e)Form2的代码: public partial class Form2 : public Form2(CSeqQueue q1) this._q1=q1;_q1.IsEmpty () +_q1.DeQueue()+ 号到一号窗口现在没有客人! private void Form2_Load(object sender, EventArgs e)Form3代码: private void Form3_Load(object sender, EventArgs e)Form4代码:using Que
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2