南京信息工程大学 实验(实习)报告
实验(实习)名称 栈和队列 日期 2017.11.8 得分 指导老师 崔萌萌
系 计算机系 专业 软件工程 年级 2016 班次 (1) 姓名 学号
一、实验目的
1、学习栈的顺序存储和实现,会进行栈的基本操作
2、掌握递归
3、学习队列的顺序存储、链式存储,会进行队列的基本操作
4、掌握循环队列的
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
示和基本操作
二、实验
内容
财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容
1、用栈解决以下问题:
(1)对于输入的任意一个非负十进制数,显示输出与其等值的八进制数,写出程序。
(2)表达式求值,写出程序。
2、用递归写出以下程序:
(1)求n!。
(2)汉诺塔程序,并截图显示3、4、5个盘子的移动步骤,写出移动6个盘子的移动次数。
3、编程实现:(1)创建队列,将asdfghjkl依次入队。(2)将队列asdfghjkl依次出队。
4、编程实现创建一个最多6个元素的循环队列、将ABCDEF依次入队,判断循环队列是否队满。
三、实验步骤
1.栈的使用
1.1 用栈实现进制的转换:
代码如下:
#include
#include
using namespace std;
int main()
{
stack s; //栈s;
int n,radix;
printf("请输入要转换的十进制非负整数: ");
scanf("%d",&n);
printf("请输入目标进制: ");
scanf("%d",&radix);
printf("转换为%d进制: ",radix);
while(n) {
s.push(n%radix);
n /= radix;
}
while(!s.empty()) { //非空
printf("%d",s.top());
s.pop();
}
printf("\n");
return 0;
}
运行结果如下:
2.2 求表达式的值
代码如下:
#include
#include
#include
#include
#define true 1
#define false 0
#define OPSETSIZE 8
typedef int Status;
unsigned char Prior[8][8] = { //运算符优先级表
// '+' '-' '*' '/' '(' ')' '#' '^'
/*'+'*/ '>','>','<','<','<','>','>','<',
/*'-'*/ '>','>','<','<','<','>','>','<',
/*'*'*/ '>','>','>','>','<','>','>','<',
/*'/'*/ '>','>','>','>','<','>','>','<',
/*'('*/ '<','<','<','<','<','=',' ','<',
/*')'*/ '>','>','>','>',' ','>','>','>',
/*'#'*/ '<','<','<','<','<',' ','=','<',
/*'^'*/ '>','>','>','>','<','>','>','>'
};
typedef struct StackChar { //StackChar类型的结点SC
char c;
struct StackChar *next;
}SC;
typedef struct StackFloat { //StackFloat类型的结点SF
float f;
struct StackFloat *next;
}SF;
SC* Push(SC* s,char c) //SC类型的指针Push,返回p
{
SC* p = (SC* )malloc(sizeof(SC));
p->c = c;
p->next = s;
return p;
}
SF* Push(SF* s,float f) //SF类型的指针Push,返回p
{
SF* p = (SF* )malloc(sizeof(SF));
p->f = f;
p->next = s;
return p;
}
SC* Pop(SC* s) //SC类型的指针Pop
{
SC* q = s;
s = s->next;
free(q);
return s;
}
SF* Pop(SF* s) //SF类型的指针Pop
{
SF* q = s;
s = s->next;
free(q);
return s;
}
float Operate(float a,unsigned char theta, float b) //计算函数Operate
{
switch(theta)
{
case '+': return a+b;
case '-': return a-b;
case '*': return a*b;
case '/': return a/b;
case '^': return pow(a,b);
default : return 0;
}
}
char OPSET[OPSETSIZE] = {'+','-','*','/','(',')','#','^'};
Status In(char Test,char *TestOp)
{
int Find = false;
for (int i=0; i< OPSETSIZE; i++) {
if(Test == TestOp[i]) Find = true;
}
return Find;
}
Status ReturnOpOrd(char op,char *TestOp)
{
for(int i=0; ic != '#') {
if (!In(*c, OPSET)) {
Dr[0] = *c;
strcat(TempData,Dr); //字符串连接函数
c++;
if (In(*c, OPSET)) {
Data = atof(TempData); //字符串转换函数(double)
OPND = Push(OPND, Data);
strcpy(TempData,"\0");
}
} else { //不是运算符则进栈
switch (precede(OPTR->c, *c))
{
case '<': //栈顶元素优先级低
OPTR=Push(OPTR, *c); c++; break;
case '=': //去括号并接收下一字符
OPTR = Pop(OPTR); c++; break;
case '>': //退栈并将运算结果入栈
继续阅读