南京信息工程大学实验(实习)报告
实验(实习)名称栈和队列日期2017.11.8 得分指导老师崔萌萌
系计算机系专业软件工程年级2016 班次(1) 姓名学号
一、实验目的
1、学习栈的顺序存储和实现,会进行栈的基本操作
2、掌握递归
3、学习队列的顺序存储、链式存储,会进行队列的基本操作
4、掌握循环队列的表示和基本操作
二、实验内容
1、用栈解决以下问题:
(1)对于输入的任意一个非负十进制数,显示输出与其等值的八进制数,写出程序。
(2)表达式求值,写出程序。
2、用递归写出以下程序:
(1)求n!。
(2)汉诺塔程序,并截图显示3、4、5个盘子的移动步骤,写出移动6个盘子的移动次数。
3、编程实现:(1)创建队列,将asdfghjkl依次入队。
(2)将队列asdfghjkl依次出队。
4、编程实现创建一个最多6个元素的循环队列、将ABCDEF依次入队,判断循环队列是否队满。
三、实验步骤
1.栈的使用
1.1 用栈实现进制的转换:
代码如下:
#include <stdio.h>
#include <stack>
using namespace std;
int main()
{
stack<int> 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 <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#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; i<OPSETSIZE; i++) {
if(op == TestOp[i]) return i;
}
}
char precede(char Aop, char Bop)
{
return Prior[ReturnOpOrd(Aop,OPSET)][ReturnOpOrd(Bop,OPSET)];
}
float EvaluateExpression(char* MyExpression)//表达式的运算符优先算法{
//OPTR和OPND分别为运算符栈和运算数栈,OP为运算符集合
SC* OPTR = NULL; //运算符栈,字符元素
SF* OPND = NULL; //运算数栈,实数元素。