问题 AC: 数据结构作业02 -- 四则运算表达式计算
内存限制:128 MB时间限制:1.000 S
评测方式:文本比较命题人:外部导入
提交:4134解决:1637
题目描述
计算非负整常数四则运算表达式,可用的运算符有:+ - * / ( ) 。
输入
一组非负整常数四则运算表达式,每个表达式输入一行,长度不超过1024个字符,每对括号内一定包含数字。
输出
每个表达式的计算结果输出一行,错误的表达式输出error。
样例输入 复制
12+5
-4-7
3-*5
((12-3)/2)+5
3+7/(2-2)
样例输出 复制
17
error
error
9
error
提示
算法流程:
E1:设立运算符栈和操作数栈;
E2:开始运算符#入栈,向表达式串尾添加结束运算符#;
E3:逐词读入表达式,并处理:
E31:若读入为操作数,则入栈;
E32:若读入为运算符,则与栈顶运算符相比较:
E321:若栈顶运算符优先级高于读入运算符:
弹出栈顶运算符和两个操作数,计算并将结果入栈,执行步骤E32;
E322:若栈顶运算符优先级低于读入运算符:
则将读入运算符入栈,执行步骤E3;
E323:若栈顶运算符优先级等于读入运算符:
若为#,计算结束,若为括号,则弹出运算符,执行步骤E3。
E4:检查栈状态,得到计算结果;
问题 AD: 栈的操作问题
内存限制:128 MB时间限制:1.000 S
评测方式:文本比较命题人:外部导入
提交:5609解决:2345
题目描述
假设入栈序列为1 2 3 4 ... n,则出栈序列是1到n的一个排列。 假设用P表示入栈操作,用Q表示出栈操作,则栈操作过程可以表示为一个由P和Q构成的序列。 对一个给定的出栈序列,应该如何操作才能得到呢?
输入
输入由若干行构成,每一行是一组由空格间隔开的整数,第一个整数是序列的长度n(n不大于1000),后面是一个1到n的排列。
输出
对每一行输入,计算对应的栈操作序列,并输出此操作序列,如果不能输出此序列,则在不能操作的位置输出"error"。
样例输入 复制
4 1 2 3 4
4 4 3 2 1
4 4 2 1 3
4 3 1 2 4
样例输出 复制
PQPQPQPQ
PPPPQQQQ
PPPPQ error
PPPQ error
问题 AE: 杨辉三角
内存限制:128 MB时间限制:1.000 S
评测方式:文本比较命题人:外部导入
提交:7569解决:1851
题目描述
中国古代数学家在数学的重要领域中,处于遥遥领先的地位,杨辉三角形的发现就是十分精彩的一页!杨辉三角形由n排数字组成,第n排含有n个数字,每排数字的首末为1,其他数是其肩上两数之和,即:第n排第j个数的数值等于第n-1排第j-1和j两数数值之和.
输入
每行是一个测试用例,输入一个所需的行数n,n为大于0小于等于30的整数。
输出
输出杨辉三角的前n行,每行输出的第一个数前面没有空格,以后的每个数据的位宽为杨辉三角中最大数的宽度加上一,每组输出数据间用换行符隔开。
样例输入 复制
7
5
样例输出 复制
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
问题 AF: 算法3-1:八进制数
内存限制:128 MB时间限制:1.000 S
评测方式:文本比较命题人:2011014323
提交:3324解决:2275
题目描述
将十进制数转换为八进制,并输出。
图:将十进制数转换为八进制并输出
输入
输入包含若干十进制正整数。
输出
输出相应的八进制数,每个占一行。
样例输入 复制
1
2
3
7
8
9
19
10020345
样例输出 复制
1
2
3
7
10
11
23
46162771
提示
*** 提示已隐藏,点击此处可显示 ***
收起提示[-]
提示: 书上有相应的算法,需要补充缺失的函数。 总结: 1、数值转换使用到堆栈,但是用函数调用(系统的堆栈)将会更为方便。 2、书中的算法实际上只能处理正整数,你有更好的方法还能够处理0和负整数么?
问题 AG: 算法3-2:行编辑程序
内存限制:128 MB时间限制:1.000 S
评测方式:文本比较命题人:2011014323
提交:2947解决:1593
题目描述
一个简单的行编辑程序的功能是:接收用户从终端输入的程序或数据,并存入用户的数据区。由于用户在终端上进行输入时,不能保证不出差错,因此,若在编辑程序中,“每接收一个字符即存入用户数据区”的做法显然不是很恰当。较好的做法是,设立一个输入缓冲区,用以接收用户输入的一行字符,然后逐行存入用户数据区。允许用户输入出差错,并在发现有误时可以及时更正。例如,当用户发现刚刚键入的一个字符是错的时,可补进一个退格符“#”,以表示前一个字符无效;如果发现当前键入的行内错误较多或难以补救,则可以键入一个退行符“@”,以表示当前行中的字符均无效。例如假设从终端接收了这样的两行字符:
whil##ilr#e(s#*s)
outcha@ putchar(*s=#++);
则实际有效的是下列两行:
while(*s)
putchar(*s++);
为此,可设这个输入缓冲区为一个栈结构,每当从终端接收了一个字符之后先作如下判别:如果它不是退格符也不是退行符,则将该字符压入栈顶;如果是一个退格符,则从栈顶删去一个字符;如果它是一个退行符,则将字符栈清为空栈。上述处理过程可用下面算法描述之:
图:行编辑程序算法
输入
若干行程序或者数据,每行不超过200个字符。
输出
经过行编辑程序处理过后的输出。
样例输入 复制
whil##ilr#e(s#*s)
outcha@ putchar(*s=#++);
样例输出 复制
while(*s)
putchar(*s++);
问题 AH: 算法3-3:迷宫
内存限制:128 MB时间限制:1.000 S
评测方式:文本比较命题人:2011014323
提交:4920解决:1292
题目描述
有一个 10 x 10 的迷宫,起点是‘S’,终点是‘E’,墙是‘#’,道路是空格。一个机器人从起点走到终点。当机器人走到一个通道块,前面已经没有路可走时,它会转向到当前方块的右手方向继续走。如果机器人能够过,则留下足迹‘*’,如果走不通,则留下标记‘!’。
下面给出书中的算法,请你模拟机器人的走法输出最终的状态。
图:迷宫算法
输入
一个 10 x 10 的二维字符数组。
输出
机器人走过的路径状态。
样例输入 复制
##########
#S # # #
# # # #
# ## #
# ### #
# # #
# # # #
# ### ## #
## E#
##########
样例输出 复制
##########
#**#!!!# #
# *#!!!# #
#**!!## #
#*### #
#***# #
# #***# #
# ###*## #
## ****#
##########
提示
输入可以用文件重定向:
freopen("/config/workspace/answer/test.in", "r", stdin);
提示:
位置,元素以及迷宫的类型定义:
struct PosType{
int r, c; // 以行号和列号作为“坐标位置”类型
};
struct SElemType{ // 定义堆栈元素的类型
int ord;// 通道块在路径上的序号
PosType seat; // 通道块在迷宫中的“坐标位置”
int di; // 从此通道块走向下一通道块的“方向” 1234对应东南西北
};
struct MazeType{ // 定义迷宫类型(二维字符数组)
char arr[10][11];
void print(){
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
cout << arr[i][j];
}
cout << endl;
}
}
};
总结: 可以试着自己写个dfs(深度优先搜索)。
注意(1):迷宫中有空格字符,可行的输入代码如下:
MazeType maze;
PosType start, end;
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
// cin >> maze.arr[i][j]; // cin会无法输入空格字符
scanf("%c",&maze.arr[i][j]);
if(maze.arr[i][j] == 'S'){
start.r = i; start.c = j;
}else if(maze.arr[i][j] == 'E'){
end.r = i; end.c = j;
}
}
getchar(); // 处理最后的换行符
}
注意(2)题目描述中的代码,会漏掉一步操作:当找不到路径的时候,会将起点位置S改写为*,实际上测试数据应该改写为!。错误原因是题目描述中算法伪代码的第27行漏掉了栈为空的时候,将无法走过的路径标记为!
修正方式,在题目描述的算法伪代码的第31行if条件,对应增加else代码,处理上述情况,代码如下:
else{
maze.arr[e.seat.r][e.seat.c] = '!';
}
问题 AI: 算法3-5:n阶Hanoi塔问题
内存限制:128 MB时间限制:1.000 S
评测方式:文本比较命题人:2011014323
提交:5150解决:2153
题目描述
假设有三个分别命名为X、Y和Z的塔座,在塔座X上插有n个直径大小各不相同、依小到大编号为1,2,...,n的圆盘。现要求将X轴上的n个圆盘移至塔座Z上并仍按同样顺序叠排,圆盘移动时必须遵循下列规则: 1)每次只能移动一个圆盘; 2)圆盘可以插在X、Y和Z中的任一塔座上; 3)任何时刻都不能将一个较大的圆盘压在较小的圆盘之上。 如何实现移动圆盘的操作呢?当n=1时,问题比较简单,只要将编号为1的圆盘从塔座X直接移至塔座Z上即可;当n>1时,需利用塔座Y作辅助塔座,若能设法将压在编号为n的圆盘之上的n-1个圆盘从塔座X(依照上述法则)移至塔座Y上,则可先将编号为n的圆盘从塔座X移至塔座Z上,然后再将塔座Y上的n-1个圆盘(依照上述法则)移至塔座Z上。而如何将n-1个圆盘从一个塔座移至另一个塔座的问题是一个和原问题具有相同特征属性的问题,只是问题的规模小1,因此可以用同样的方法求解。由此可得如下图算法所示的求解n阶Hanoi塔问题的C函数。
图:求解n阶Hanoi塔问题的C函数
现在就请你将上述算法实现吧。
输入
输入数据有多组,每组1个整数n,表示Hanoi塔的阶数。
输出
将每次移动(move)按照以下格式输出:%2d. Move disk %d from %c to %c\n
上述格式中第一个整数表示第几次移动,第二个整数表示移动第几个圆盘,后两个字符表示将圆盘从哪个塔座移至哪个塔座上。每组输出后面输出一个空行。
样例输入 复制
1
2
3
样例输出 复制
1. Move disk 1 from X to Z
1. Move disk 1 from X to Y
2. Move disk 2 from X to Z
3. Move disk 1 from Y to Z
1. Move disk 1 from X to Z
2. Move disk 2 from X to Y
3. Move disk 1 from Z to Y
4. Move disk 3 from X to Z
5. Move disk 1 from Y to X
6. Move disk 2 from Y to Z
7. Move disk 1 from X to Z
提示
*** 提示已隐藏,点击此处可显示 ***
收起提示[-]
提示: 1、算法描述中输出使用的是%i,实际上就是使用%d。 2、输出时移动次数是两位的,我们保证输入量不会太大。 3、如果使用全局变量来记录移动的次数,注意每次在进行一个新的一组测试时,需要将这个全局计数变量设为0。 总结: Hanoi塔(汉诺塔)是一个典型的利用递归解决的问题。如果你对迭代(循环)更有偏好,不妨用迭代来实现试试。
问题 AJ: 算法3-7:银行排队
内存限制:128 MB时间限制:1.000 S
评测方式:文本比较命题人:2011014323
提交:2204解决:1578
题目描述
我们大多都有在银行排队的经历,唉,那坑爹的排队啊!现在就让我们来算算我们这些客户平均需要等多久吧。
每天刚开始时银行会开m个窗口来为我们total个客户办理业务,当有客户需要办理业务时,先选择可以办理业务的窗口,如果有多个窗口可以办理业务就选择空闲时间最长的窗口,如果有多个窗口空闲的时间一样长,则选择序号小的窗口办理业务。假设我们每个人来到的时间和办理业务所需要的时间(为了简化问题,采用整数表示时间)都知道了。现在请你算算我们平均需要等待多久呢?
输入
有多组测试数据,每组数据开始有两个正整数m(<20)和total(<200),后面有total对整数,对应客户先后到来的时间以及办理业务所需的时间。
输出
平均等待的时间,保留两位小数。
样例输入 复制
2 6 1 3 4 1 5 3 9 2 13 4 13 3
3 14 0 3 2 2 2 4 5 4 7 2 11 3 12 3 12 4 12 1 13 3 15 4 19 1 22 3 23 2
2 5 0 6 0 5 0 6 7 1 7 2
样例输出 复制
0.00
0.29
1.20
提示
提示: 题目中选择办理的窗口有三个状态,实际上从序号自小到大查找可以最早办理业务的窗口就已经满足上述三个状态了。可以使用数组来模拟列表。 总结: 实际上数组既可以模拟堆栈又可以模拟队列。
问题 AK: 括号匹配问题
内存限制:128 MB时间限制:1.000 S
评测方式:文本比较命题人:liuyong
提交:3654解决:1980
题目描述
判断仅由小括号组成的字符串是否满足括号匹配规则
输入
输入包括多行,每行一个仅有小括号组成的字符串,长度不超过100
输出
输出包括多行,如果对应的输入括号匹配,输出YES,否则输出NO
样例输入 复制
()()()
((()))
())(
((()
样例输出 复制
YES
YES
NO
NO
问题 AL: 案例3-1.9:银行业务队列简单模拟
内存限制:128 MB时间限制:1.000 S
评测方式:文本比较命题人:admin
提交:576解决:601
题目描述
设某银行有A、B两个业务窗口,且处理业务的速度不一样,其中A窗口处理速度是B窗口的2倍 —— 即当A窗口每处理完2个顾客时,B窗口处理完1个顾客。给定到达银行的顾客序列,请按业务完成的顺序输出顾客序列。假定不考虑顾客先后到达的时间间隔,并且当不同窗口同时处理完2个顾客时,A窗口顾客优先输出。
按业务处理完成的顺序输出顾客的编号。数字间以空格分隔,但最后一个编号后不能有多余的空格。
输入
输入为一行正整数,其中第1个数字N(≤1000)为顾客总数,后面跟着N位顾客的编号。编号为奇数的顾客需要到A窗口办理业务,为偶数的顾客则去B窗口。数字间以空格分隔。
输出
按业务处理完成的顺序输出顾客的编号。数字间以空格分隔,但最后一个编号后不能有多余的空格。
样例输入 复制
8 2 1 3 9 4 11 13 15
样例输出 复制
1 3 2 9 11 4 13 15