第一篇:实验三 队列实现杨辉三角
实验3队列实现杨辉三角
一、实验目的
1.熟悉队列的逻辑结构。2.回顾常用的存储结构。
3.掌握System.Collection.Queue类的使用方法。
4.熟悉队列的几种典型应用,用队列来解决一些编程问题。5.用循环队列实现杨辉三角并测试。
二、实验内容
杨辉三角是除了每一行的第一个元素和最后一个元素是1,其他元素的值是上一行与之相邻的两个元素之和。
1.实现循环队列类 a)两个构造函数 b)入队 c)出队
2.用顺序循环队列实现杨辉三角(一)程序分析 2.1存储结构
用一片连续的存储空间来存储循环队列中的数据元素,即采用顺序存储的方式。2.2 关键算法分析 1.出队
1)自然语言描述: a.判断队列是否空 b.如果队列空,抛出异常 c.如果队列不空,则
i.ii.iii.元素出队 移动对头指针 队列长度减1 代码描述:
publicvirtualobjectDequeue()//出队 {
} if(this._size == 0){ //队下溢
} object obj2 = this._array[this._head];//出队 this._array[this._head] = null;//删除出队元素 //移动队头指针
this._head =(this._head + 1)% this._array.Length;this._size--;return obj2;thrownewInvalidOperationException(“队列为空”);时间复杂度:O(1)2.入队
自然语言描述:
d.判断队列是否满 e.如果队列满,则扩容 f.如果队列不满,则
a)元素入队 b)移动队尾指针 c)队列长度加1 代码描述:
publicvirtualvoidEnqueue(objectobj)//入队 {
} if(this._size == this._array.Length)//当数组满员时 { //计算新容量
} this._array[this._tail] = obj;//入队
this._tail =(this._tail + 1)% this._array.Length;//移动队尾指针 this._size++;int capacity =(int)((this._array.Length * this._growFactor)/ 100L);if(capacity <(this._array.Length + _MinimumGrow)){ //最少要增长4个元素
} this.SetCapacity(capacity);//调整容量 capacity = this._array.Length + _MinimumGrow;时间复杂度:O(1)3.打印杨辉三角
自然语言描述: 要定义的变量:
1)行:n
2)列:
i.ii.空格 j 数值
k 3)左肩:left 4)右肩:right 代码描述:
三、程序运行结果
四、实验心得
1.调试时出现的问题及解决的方法
2.心得体会
3.下一步的改进
第二篇:实验三 栈和队列
实验报告三 栈和队列
班级: 姓名: 学号: 专业:
一、实验目的:
(1)掌握栈的基本操作的实现方法。
(2)利用栈先进后出的特点,解决一些实际问题。(3)掌握链式队列及循环队列的基本操作算法。(4)应用队列先进先出的特点,解决一些实际问题。
二、实验内容:
1、使用一个栈,将一个十进制转换成二进制。粘贴源程序:
package Word1;
public class Node
} T data;Node
} this.data=a;this.next=n;this(a,null);
-----package Word1;
public class Stack
} public Node
}
T a=this.Top.data;this.Top=this.Top.next;return a;this.Top=new Node
--package Word1;
import java.util.*;
public class Test {
} static Scanner scan=new Scanner(System.in);static int temp=0;static int a=0;static Stack
} temp=scan.nextInt();while(true){
} while(s.Top!=null){
} System.out.printf(“%d”,s.Out());a=temp%2;s.push(a);temp=temp/2;if(temp==0)break;
粘贴测试数据及运行结果:
2、回文是指正读反读均相同的字符序列,如“acdca”、“dceecd”均是回文,但“book”不是回文。利用1中的基本算法,试写一个算法判定给定的字符串是否为回文。(提示:将一半字符入栈,依次弹出与另一半逐个比较)粘贴源程序:---------package Word1;
import java.util.*;public class Test1 {
} static Scanner sc=new Scanner(System.in);static char[] c={'a','b','c','b','a'};static Stack
} public static String One(){
} public static String Two(){
} for(int i=0;i<(c.length/2);i++){ } for(int i=c.length/2;i } return “该字符串是回文”;if(s.Out()!=c[i])return “该字符不是回文”;s.push(c[i]);for(int i=0;i<(c.length/2);i++){ } for(int i=c.length/2+1;i } return “该字符串是回文”;if(s.Out()!=c[i])return “该字符串不是回文”;s.push(c[i]);if(c.length%2!=0){ } else{ } System.out.println(Two());System.out.println(One()); ------------- 粘贴测试数据及运行结果: 3、使用3个队列分别保留手机上最近10个“未接来电”、“已接来电”、“已拨电话”。 粘贴源程序: package Word3; import java.util.*; public class Queue LinkedList } } System.out.printf(“%d n”,this.deQ()); package Word3; import java.util.*; public class Test { static Queue } static private void T2(){ int c;int[] a={22324,321321,222333};for(int i=0;i 1、查询 2、增加”);c=sc.nextInt();if(c==1){ } else{ c=sc.nextInt();while(!(list2.isEmpty()))System.out.printf(“%d n”,list2.deQ());list2.enQ(a[i]);int c=0;System.out.println(“请选择记录类型:”);System.out.println(“ 1、未接来电 2、已接来电 3、已拨电话”);switch(c=sc.nextInt()){ } case 1:T1();break;case 2:T2();break;case 3:T3();break;Frame(); } } list2.enQ(c);while(!(list2.isEmpty()))System.out.printf(“%d n”,list2.deQ());sc.close();static private void T3(){ } static private void T1(){ int c;int[] a={12324,321321,222333};for(int i=0;i 1、查询 2、增加”);c=sc.nextInt();if(c==1){ } else{ c=sc.nextInt();while(!(list1.isEmpty()))System.out.printf(“%d n”,list1.deQ());list1.enQ(a[i]);int c;int[] a={32324,321321,222333};for(int i=0;i 1、查询 2、增加”);c=sc.nextInt();if(c==1){ } else{ } sc.close();c=sc.nextInt();list3.enQ(c);while(!(list3.isEmpty()))System.out.printf(“%d n”,list3.deQ());while(!(list3.isEmpty()))System.out.printf(“%d n”,list3.deQ());list3.enQ(a[i]); } } } list1.enQ(c);while(!(list1.isEmpty()))System.out.printf(“%d n”,list1.deQ());sc.close(); 粘贴测试数据及运行结果: 三、心得体会:(含上机中所遇问题的解决办法,所使用到的编程技巧、创新点及编程的心得) 一、实验目的 掌握栈的数据类型描述及栈的特点; 掌握栈的顺序存储结构的特点及算法描述; 掌握队列的数据类型描述及链式存储结构的特点和算法描述。 二、实验内容 停车场管理。设有一个可以停放n辆汽车的狭长停车场(先进后出),它只有一个大门可以供车辆进出。车辆按到达停车场时间的先后依次从停车场最里面向大95E8口处停放(最先到达的第一辆车停放在停车场的最里面)。如果停车场已放满n辆车,则后来的车辆只能在停车场大门外的便道上等待,一旦停车场内有车离开,则排在便道上的第一辆车就可以进入停车场。停车场内如有某辆车要离开,在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些车再按原来的次序进停车场。每辆车在离开停车场时,都应根据它在停车场内停留的时间长短交费。如果停留在便道上的车没进停车场就要离开,允许其离开,不收停车费,并且仍然保持在便道上的车辆次序。试编程模拟停车场管理。 三、算法描述 提示:可以将停车场定义成一个顺序栈s1,便道定义成一个链队列q,而停车场中的某辆车要离开,则在它后面进停车场的车必须让道,让其离开,故还必须有一个临时的顺序栈s2,存放让道的车辆。 当有车辆进停车场时,直接进入s1栈,若s1栈满,则进入便道(链队列q)。若有s1中车辆x离开时,先让在x后面进栈的车从s1退栈并进栈到s2中,让x离开并收取停车费,然后,再把s2中的所有车辆退栈并重新进入s1栈,最后,将链队列q的队头车辆进栈到s1中并删除队头车辆。若有链队列q(便道)中的车辆y离开时,从链队列中删除该车辆即可,不收停车费。 车辆的数据可以表示为(车辆编号,到达/离开时间)。 四.程序清单: #include SeqStack(){top=-1;} ~SeqStack(){};void Push(int x);void Push2(int x);int *Return();int Pop(int y);int Count();void PrintStack();private: int data[StackSize];int top;};//入栈 void SeqStack::Push(int x){ if(top>=StackSize-1)throw“上溢”;for(int i=0;i<=top+1;i++){ if(data[i]==x) { cout<<“该车牌已经存在!请重新输入: ”; i=-1; cin>>x; } } top++;data[top]=x;} //返回数组地址 int *SeqStack::Return(){ return data;} //临时栈 void SeqStack::Push2(int x){ top++;data[top]=x; } //输出函数 void SeqStack::PrintStack(){ for(int i=0;i<=top;i++) cout<<“位置为”< int SeqStack::Pop(int y){ if(top==-1)throw“下溢”;int x;x=data[top--];if(y==top+2)data[top+1]=123456789;if(top==-1)data[top+1]=123456789;return x;} //数数 int SeqStack::Count(){ return top;} //队列 struct Node { int data;Node *next;};class LinkQueue { public: LinkQueue();void EnQueue(int x,int *q);void xzDeQueue(int x);int Count();int DeQueue(); private: Node *front,*rear;};//构造函数 LinkQueue::LinkQueue(){ Node *s=new Node;s->next=NULL;front=rear=s;} //入队 void LinkQueue::EnQueue(int x,int *q){ Node *s=new Node;Node *p=new Node;p=front;while(p){ if(p->data ==x) { cout<<“便道已有该车牌号,请重新输入: ”; cin>>x; for(int i=0;i<5;i++) { if(x==q[i]) { cout<<“停车场已有该车牌号,请重新输入: ”; cin>>x; i=-1; } } p=front;} p=p->next;} s->data =x;s->next =NULL; rear->next =s;rear=s;} //出队 int LinkQueue::DeQueue(){ if(front==rear)throw“便道无车辆”;Node *p=new Node;int x;p=front->next;x=p->data;front->next =p->next;if(p->next ==NULL)rear=front;delete p;return x;} //计算结点数 int LinkQueue::Count(){ Node *p=new Node;p=front;int i=0;while(p&&p->next!=NULL){ p=p->next; i++;} return i;} //选择性出队 void LinkQueue::xzDeQueue(int x){ if(rear==front)throw“便道无车辆”;Node *p=new Node;p=front;int y;int i=0;for(;p->next!=NULL;p=p->next) { if(p->next->data ==x) if(p->next->next!=NULL) { Node *q=new Node; q=p->next; y=q->data; p->next =q->next; i=1; delete q; cout<<“车牌号为:”< break; } else { Node *q=new Node; q=p->next; y=q->data; p->next =NULL; i=1; delete q; if(front->next==NULL)rear=front; cout<<“车牌号为:”< break; } } if(i==0)cout<<“无车牌号为:”< SeqStack b;//b是作为临时存放车辆的栈 LinkQueue c;//c是作为便道的队列 cout<<“tttt1.车辆进入”< cout<<“tttt4.便道车辆离开”< int xh1=1;//xh1为菜单最外层的循环控制变量 int time[100];//记录各车辆进入停车场的时间 int t1=0;//作为车辆对应的时间编号 int money=1;while(xh1==1){ cout<<“请选择指令: ”; cin>>zl; switch(zl) { case 1: try{ int n1=a.Count(); int n; cout<<“请输入车牌号: ”; cin>>n; if(n1==4) { int *Num=a.Return(); for(int i=0;i<=4;i++) if(Num[i]==n) { cout<<“停车场已有该车牌号,请重新输入!”; cin>>n; i=-1; } int *CarNum=a.Return(); c.EnQueue(n,CarNum); cout<<“停车场已满,请在便道等候!”< break; } a.Push(n); cout<<“请输入进入时间: ”; cin>>time[t1]; while(time[t1]<0||time[t1]>=24) { cout<<“请输入正确的时间(0~23时):”; cin>>time[t1]; } t1++; } catch(char*s){cout< break; case 2: try{int n2;//离开车辆的编号 cout<<“请输入要离开的车的位置: ”; cin>>n2; if(a.Count()+1==0) { cout<<“该停车场没有车辆,请选择其他操作!”; break; } else while(n2<1||n2>a.Count()+1) { cout<<“请输入1~”< cin>>n2; } int j=a.Count(); for(int i=0;i<(j+1-n2);i++) b.Push2(a.Pop(n2)); a.Pop(n2); int j2=b.Count(); for(int i1=0;i1<=j2;i1++) a.Push(b.Pop(n2)); int j3=c.Count(); int time1; cout<<“请输入离开时间: ”; cin>>time1; while(time1<0||time1>23) { cout<<“请输入正确的时间(0~23时): ”; cin>>time1; } int day=0; if(time1第三篇:实验三 栈和队列的应用