第一篇:使用队列栈结构反序输出字符串
队列结构
实验目的
1.熟练掌握栈和队列的特点。
2.掌握栈的定义和基本操作,熟练掌握顺序栈的操作及应用。3.掌握对列的定义和基本操作,熟练掌握链式队列的操作及应用, 掌握环形队列的入队和出队等基本操作。
4.加深对栈结构和队列结构的理解,逐步培养解决实际问题的编程能力。
实验要求
1.认真阅读和掌握本实验的算法。2.上机将本算法实现。
3.保存程序的运行结果,并结合程序进行分析。
4.上机过程中,能够熟练运用高级语言的程序调试器DEBUG调试程序。5.上机后,认真整理源程序及其注释,完成实验报告(包括源程序、实验结果、算法分析、心得体会等)。
实验内容
1.在VC++环境下编写调试队列初始化,删除结点,查找结点,插入结点的算法和函数。
2.把已布置作业中的算法改成程序,进行运行。
实验清单
#include
#define size 50
typedef struct { char str[size];int top;}seqstack;
void initstack(seqstack *s);int pop(seqstack *s,char x);int push(seqstack *s,char x);void main(){ int i,j;char str[size],a;seqstack *s;printf(“please input a string :n”);gets(str);s=(seqstack*)malloc(size);initstack(s);for(i=0;str[i]!=' ';i++){ push(s,str[i]);j++;} printf(“the changed string is:n”);for(j=i;j>0;j--){ pop(s,a);
} printf(“n”);}
void initstack(seqstack *s){
s->top=-1;}
int push(seqstack *s,char x){ if(s->top==size-1)
return(0);s->top++;s->str[s->top]=x;return(1);}
int pop(seqstack *s,char x){ if(s->top==-1)
return(0);else {
}
} x=s->str[s->top];s->top--;printf(“%c”,x);return(1);输入数据及相应运行结果
实验心得
在这节课中,我学会用调试这种方法来找出自己的错误
在实验的时候,发现自己对指针内存分配的情况还不是很清楚,会造成内存出错 经过这次上机实验,感觉到自己对序列栈的理解更加深刻,使用起来也更加得心应手
第二篇:字符串输出格式
printf的格式控制的完整格式:
%-0m.nl或h格式字符
下面对组成格式说明的各项加以说明:
①%:表示格式说明的起始符号,不可缺少。
②-:有-表示左对齐输出,如省略表示右对齐输出。
③0:有0表示指定空位填0,如省略表示指定空位不填。
④m.n:m指域宽,即对应的输出项在输出设备上所占的字符数。
n指精度,用于说明输出的实型数的小数位数。为指定n时,隐含的精度为n=6位。
⑤l或h:l对整型指long型,对实型指double型。h用于将整型的格式字符修正为short型。
格式小结:
(1)最常用的格式是%d,含义是以10进制形式打印一个整数。
如果输出的整数是负数,则输出的第一个字符就是-号。
%d:按整型数据的实际长度输出。
%md:m为指定的输出字段的宽度。如果数据的位数小于m,则左端补以空格,若大于m,则按实际位数输出。
%ld:输出长整型数据。
(2)%u格式与%d格式类似,只不过要求打印无符号10进制整数。
以无符号十进制形式输出整数。
对长整型可以用“%lu”格式输出。同样也可以指定字段宽度用“%mu”格式输出。
(3)%o格式请求输出8进制整数,以无符号八进制形式输出整数。
对长整型可以用“%lo”格式输出。同样也可以指定字段宽度用“%mo”格式输出。
(4)%x和%X格式请求输出16进制整数。
%x格式中用小写字母a,b,c,d,e,f来表示10到15之间的数,以无符号十六进制形式输出整数。
对长整型可以用“%lx”格式输出。同样也可以指定字段宽度用“%mx”格式输出。%X格式中用大写字母A,B,C,D,E,F来表示10到15之间的数
共同点:8进制和16进制整数总是作为无符号数处理的。
(5)%s格式用于打印字符串,与之对应的参数应该是一个字符指针,待输出的字符始于该指针所指向的地址,直到出现一个空字符(' ')才终止。%s:例如:printf(“%s”, “CHINA”)输出“CHINA”字符串(不包括双引号)。%ms:输出的字符串占m列,如字符串本身长度大于m,则突破获m的限制,将字符串全部输出。若串长小于m,则左补空格。
%-ms:如果串长小于m,则在m列范围内,字符串向左靠,右补空格。
%m.ns:输出占m列,但只取字符串中左端n个字符。这n个字符输出在m列的右侧,左补空格。
%-m.ns:其中m、n含义同上,n个字符输出在m列范围的左侧,右补空格。如果n>m,则自动取n值,即保证n个字符正常输出。
(6)%c格式用于打印单个字符:例如:
printf(“%c”,c);等价于 putchar(c);
(7)%g,%f和%e这三个格式用于打印浮点值。
%g格式用于打印那些不需要按列对齐的浮点数特别有用。其作用有二: 一,去掉该数尾多余的零(没有达到六位的数)
二,保留六位有效数字(多余六位的)
%e格式用于打印浮点数时,一律显示地使用指数形式:例如:输出圆周率时是:
3.141593e+00
两者的区别:
%g格式打印出的数是总共6位有效数字
%e格式打印出小数点后的6位有效数字
%f禁止使用指数形式来表示浮点数。因此圆周率输出为:3.141593
(但注意它的精度要求:也是小数点后6位有效数字)
(8)%%格式用于打印一个%字符。
(9)%E和%G只是在输出时用大写字母(E)代替了小写字母(e)
⑦f格式:用来输出实数(包括单、双精度),以小数形式输出。有以下几种用法:
%f:不指定宽度,整数部分全部输出并输出6位小数。
%m.nf:输出共占m列,其中有n位小数,如数值宽度小于m左端补空格。%-m.nf:输出共占n列,其中有n位小数,如数值宽度小于m右端补空格。⑧e格式:以指数形式输出实数。可用以下形式:
%e:数字部分(又称尾数)输出6位小数,指数部分占5位或4位。
%m.ne和%-m.ne:m、n和”-”字符含义与前相同。此处n指数据的数字部分的小数位数,m表示整个输出数据所占的宽度。
⑨g格式:自动选f格式或e格式中较短的一种输出,且不输出无意义的零。/*******************************************************************/ unsigned int i=295;
printf(“%dn”,i);
295
Press any key to continue
(1).可以在“%”和字母之间插进数字表示最大场宽。
例如: %2d 表示输出3位整型数, 不够2位右对齐。
例如: %5d 表示输出3位整型数, 不够5位右对齐。
例如: %10d 表示输出3位整型数, 不够10位右对齐。
unsigned int i=295;
printf(“%2dn”,i);
printf(“%5dn”,i);
printf(“%10dn”,i);
295
295
295
Press any key to continue
(2).补0或者其它
例如: %02d 表示输出3位整型数, 不够2位右对齐,补0。
例如: %05d 表示输出3位整型数, 不够5位右对齐,补0。
例如: %010d 表示输出3位整型数, 不够10位右对齐,补0。
unsigned int i=295;
printf(“%02dn”,i);
printf(“%05dn”,i);
printf(“%010dn”,i);
295
00295
0000000295
Press any key to continue
(3).负数
int i=-295;
printf(“%02dn”,i);
printf(“%05dn”,i);
printf(“%010dn”,i);
-295
-0295
-000000295
Press any key to continue
(4).可以控制输出左对齐或右对齐, 即在“%”和字母之间加入一个“-” 号可 说明输出为左对齐, 否则为右对齐。
unsigned int i=295;
printf(“%-02dn”,i);
printf(“%-05dn”,i);
printf(“%-010dn”,i);
295
295
295
Press any key to continue
(5).可以在“%”和字母之间加小写字母l, 表示输出的是长型数。
例如: %ld 表示输出long整数
%lf 表示输出double浮点数
(6).%9.2f 表示输出场宽为9的浮点数, 其中小数位为2, 整数位为6, 小数点占一位, 不够9位右对齐。
例如: %6.9s 表示显示一个长度不小于6且不大于9的字符串。若大于9, 则第9个字符以后的内容将被删除./*
unsigned int i=295;
printf(“%dn”,i);
printf(“%1dn”,i);
printf(“%09dn”,i);
printf(“%09dn”,(unsigned char)i);
printf(“%9dn”,(unsigned char)i);
printf(“%-9dn”,(unsigned char)i);
*/
/*
295
295
000000295
000000039
Press any key to continue
*/
/*******************************************************************/ 对于m.n的格式还可以用如下方法表示(例)
int m=10,n=5;
char ch[]=“abcdefghijklmnopqrst”;
printf(“%*.*sn”,m,n,ch);//输出为abcde
前边的*定义的是总的宽度,后边的定义的是输出的个数,分别对应外面的参数m和n。
我想这种方法的好处是可以在语句之外对参数m和n赋值,从而控制输出格式 /*******************************************************************/ “%08lxn”,4byte
“%04xn”,2byte
“%-2.2BX”,1byte
第三篇:实验三 栈和队列
实验报告三 栈和队列
班级: 姓名: 学号: 专业:
一、实验目的:
(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(); 粘贴测试数据及运行结果: 三、心得体会:(含上机中所遇问题的解决办法,所使用到的编程技巧、创新点及编程的心得) 栈和队列上机实习 1、实验目的: (1)熟练掌握栈的逻辑结构和操作规则,能在相应的实际问题中正确选用该结构。(2)熟练掌握栈的2种存储结构实现方法(顺序栈和链栈),两种存储结构和基本运算的实 现算法,注意栈空盒满的判断条件及它们的描述方法。 (3)熟练掌握队列的逻辑结构和操作规范,能在相应的实际问题中正确选用该结构。(4)掌握循环队列与链队列两种存储结构的实现,熟练掌握各种队列基本运算的实现。 2、实验要求: (1)顺序栈的插入、删除,栈顶数据元素的读取。(2)链栈的插入、删除,栈顶数据元素的读取。(3)循环队列的插入、删除。(4)链队列的插入、删除。 3、实验内容: ① 栈 (1)抽象数据类型定义 typedef struct { ElemType data[MaxSize]; //栈的空间大小为MaxSize int top; //设置栈顶指针 }SqStack; //栈的结构定义 在本次实验中,首先建立一个空栈,进入主程序后首先初始化栈为其分配空间,然后进入菜单选择界面,通过不同的数字输入,实现入栈,出栈,读取栈顶元素,显示栈的所有元素,栈的长度,释放栈等操作。 (2)存储结构定义及算法思想 在栈结构体的定义中,typedef int Typeelem 为整型,存储结构(入栈)如下: cin>>a; s->top++; //在入栈是首先将栈顶指针向上加1 s->data[s->top]=a; //与数组赋值一样,直接赋值 //其他存储与此类似,都是直接赋值与数组的某一位 退栈函数模块: void Pop(SqStack * &s){ //对指针的引用 if(s->top ==-1){ cout<<“栈是空栈,不能退栈”< //首先判断是否为空栈,若为空,则退出 return;} cout<<“退栈的元素为:”< //显示退栈元素 s->top--; //栈顶元素减1,指向实际栈的最上面 } 显示栈所有元素函数模块: void DispStack(SqStack *s){ //从栈顶到栈底顺序显示所有元素 int i;cout<<“栈的元素分别为:”< //同过循环实现实现从栈顶元素到栈底元素的遍历以输出 } cout< 栈结构的入栈和退栈是两个相反的过程,先进后出,入栈是先让栈顶指针加1,指向未被赋值位置,然后进行赋值,退栈是先取出退栈元素,然后栈顶元素减1,指向推展后的实际栈顶。诸如读取栈顶元素,显示栈的元素,读取栈的长度,都是用过对栈顶指针实现相关操作。 (3)实验结果与分析 ② 循环队列 (1)抽象数据类型定义 typedef struct { ElemType elem[Maxqsize]; //循环队列的长度为MaxSize int front,rear; //设置队列的头指针和尾指针 }SqQueue; //循环队列的结构体定义 在本次实验中,首先建立一个空队列,进入主程序后首先初始化队列为其分配空间,然后进入菜单选择界面,通过不同的数字输入,实现入队,出队,显示队列的所有元素,队列的长度,释放队列等操作。 (2)存储结构定义及算法思想 在队列结构体的定义中,typedef int Typeelem 为整型,存储(入队)结构如下: q->rear=(q->rear+1)%Maxqsize; //尾指针加1 q->elem[q->rear]=a; //将入队元素装到新的空尾部 在此队列的存储结构的实现:先让队尾指针进1,再将新的元素加入到队尾指针所指示的位置,因此,队尾指针指示实际的队尾位置,队头指针指示实际队头的前一位置,要想退出队头元素,必须先让队头指针进1,才能取出队头元素。 退队函数模块如下: void deQueue(SqQueue *&q){ //对指针的引用 if(QueueEmpty(q)) { //调用带返回值的判断空队函数 cout<<“队列为空”< //判断队列是否为空 } q->front=(q->front+1)%Maxqsize; //队头指针进1 cout<<“退队的元素为:”< //取出队头元素 } 遍历队表函数: void displayqueue(SqQueue *q){ int m;m=q->front+1; //队头元素进1,指向实际队头 if(QueueEmpty(q)) { cout<<“队列为空”< //判断是够为空队 } cout<<“所有队列元素为:”< while(q->rear+1>m){ cout< //通过循环遍历所有元素 m++; } cout< 循环队列的入队和退队分别是在队尾与队头跟别进行操作的,通过队头队尾指针的操作便可实现对队列的相关操作。 (3)实验结果与分析 ③ 心得体会 本次上机是做栈与队列的操作,这次实验,我有意的用到了对指针的引用与指针实现子函数功能的调用,刚开始编译的时候也有错误,但是在慢慢的摸索中,也逐渐掌握了它们的用法,这次实验也让我熟练了对队列与栈存储结构的应用。 附录: 顺序表源代码: 栈: #include void InitStack(SqStack * &s) //建立一个空栈,即将栈顶指针指向-1即可 的引用 { s=(SqStack *)malloc(sizeof(SqStack));s->top=-1;} void ClearStack(SqStack * &s) //释放栈s占用的存储空间 { free(s);} void StackLength(SqStack *s) { cout<<“栈的长度为:” <<(s->top +1)< int StackEmpty(SqStack *s){ return(s->top==-1);} void Push(SqStack *&s){ if(s->top==MaxSize-1) { cout<<“栈满”< // s=(SqStack *)realloc(s,sizeof(SqStack));} int a; 指针 cout<<“请输入入栈元素”< void Pop(SqStack * &s){ if(s->top ==-1){ cout<<“栈是空栈,不能退栈”< return;} cout<<“退栈的元素为:”< void GetTop(SqStack * &s,ElemType &e){ if(s->top==-1){cout<<“空栈”< void DispStack(SqStack *s) //从栈顶到栈底顺序显示所有元素 { int i;cout<<“栈的元素分别为:”< cout<<“请选择功能”< cout<<“ 入栈 1”< cout<<“ 出栈 2”< cout<<“ 读取栈顶元素 3”< cout<<“ 显示栈所有元素 4”< cout<<“ 栈的长度 5”< cout<<“ 释放栈 6”< cin>>k; switch(k) { case 1: Push(s);break; case 2: Pop(s);break; case 3: GetTop(s,e);cout<<“栈顶元素为: ”< case 4: DispStack(s);break; case 5: StackLength(s);break; case 6: ClearStack(s);break; default :break; } } } 队列: #include TypeElem elem[Maxqsize]; int front,rear;}SqQueue;void InitQueue(SqQueue *&q){ q=(SqQueue *)malloc(sizeof(SqQueue)); q->front=q->rear=0;} void ClearQueue(SqQueue *&q){ free(q);exit(0);} void QueueLength(SqQueue *q){ cout<<“队列长度为:”<<(q->rear-q->front+Maxqsize)%Maxqsize< return(q->front==q->rear); } void enQueue(SqQueue *&q){ int a; if((q->rear+1)%Maxqsize==q->front) { cout<<“队列已满,无法插入”< } cout<<“请输入插入元素”< cin>>a; q->rear=(q->rear+1)%Maxqsize; q->elem[q->rear]=a;} void deQueue(SqQueue *&q){ if(QueueEmpty(q)) { cout<<“队列为空”< } q->front=(q->front+1)%Maxqsize; cout<<“退队的元素为:”< } void displayqueue(SqQueue *q){ int m;m=q->front+1; if(QueueEmpty(q)) { cout<<“队列为空”< } cout<<“所有队列元素为:”< while(q->rear+1>m) { cout< m++; } cout< int k=0; SqQueue *q; InitQueue(q); if(QueueEmpty(q))cout<<“队列为空”< while(1){ cout<<“请选择功能”< cout<<“ 入队 cout<<” 出队 cout<<“ 队列长度 cout<<” 显示队列元素 cout<<“ 释放栈 cin>>k; switch(k) { case 1: enQueue(q);break; case 2: deQueue(q);break; case 3: QueueLength(q);break; case 4: displayqueue(q);break; case 5: ClearQueue(q);break; default :break; } } } 1”< 2“< 4“< 实验5 栈和队列的应用 目的和要求: (1)熟练栈和队列的基本操作;(2)能够利用栈与队列进行简单的应用。 一、题目 题目1.利用顺序栈和队列,实现一个栈和一个队列,并利用其判断一个字符串是否是回文。所谓回文,是指从前向后顺读和从后向前倒读都一样的字符串。例如,a+b&b+a等等。 题目2.假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队。跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴。若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。现要求写一算法模拟上述舞伴配对问题,并实现。 题目3.打印机提供的网络共享打印功能采用了缓冲池技术,队列就是实现这个缓冲技术的数据结构支持。每台打印机具有一个队列(缓冲池),用户提交打印请求被写入到队列尾,当打印机空闲时,系统读取队列中第一个请求,打印并删除之。请利用队列的先进先出特性,完成打印机网络共享的先来先服务功能。 题目4.假设以数组Q[m]存放循环队列中的元素, 同时设置一个标志tag,以tag == 0和tag == 1来区别在队头指针(front)和队尾指针(rear)相等时,队列状态为“空”还是“满”。试编写与此结构相应的插入(enqueue)和删除(dlqueue)算法。 题目5.利用循环链队列求解约瑟夫环问题。 请大家从本组未讨论过的五道题中选择一道,参照清华邓俊辉老师MOOC视频及课本相关知识,编写相应程序。 选择题目3: 打印机提供的网络共享打印功能采用了缓冲池技术,队列就是实现这个缓冲技术的数据结构支持。 二、程序清单 //Ch3.cpp #include { p=front; front=front->link; delete p;} };template if(front==NULL){//判断是否为空 front=rear=new LinkNode front->data=rear->data=x; if(front==NULL)//分配结点失败 return false;} else{ rear->link=new LinkNode rear->link->data=x; if(rear->link==NULL) return false; rear=rear->link;} return true;};template { return false;} cout< LinkNode delete p;//释放原结点 return true;};void main() //主函数 { LinkedQueue char flag='Y'; //标志是否输入了命令 const int max=30;//一次获取输入命令的最大个数 while(flag=='Y')//循环 { int i=0;char str[max];//定义存储屏幕输入的命令的数组 gets(str);//获取屏幕输入的命令 while(str[i]!=' '){ q.put_in(str[i]);//调用提交命令函数,将每个命令存入队列中 i++; } for(int j=0;j<=i;j++){ if(q.IsEmpty()==true)//判断是否为空,为空则说明没有可执行的命令 { cout<<“已经没有可执行的命令!是否继续输入命令(Y|N)?”< cin>>flag;continue;//为空跳出for循环为下次输入命令做好准备 } q.carry_out();//调用执行命令的函数,将命令打印并删除 } 三、程序调试过程中所出现的错误 无。 四、运行结果: 五、心得体会 打印机采用的缓冲池技术,本质上就是利用了队列的先进先出的特点,体现了先来后到原则。虽然意思很简单,但是实际编程过程中,出现bug的概率还是蛮高的,因为在编写程序中一点疏忽就容易产生错误。 本来我对模板类的使用还是很模糊的,通过这个例子,至少让我清楚了模板类的使用和特点。觉得模板类的恰当使用,对于自己今后的编程好处还是很大的。第四篇:数据结构栈与队列报告
第五篇:实验报告——栈和队列的应用