编写c语言程序 输出出队序列,第03次作业-栈和队列

栈和队列

思维导图

cf2f32e27be7fd1852eba6ecd1b7c007.png

PTA实验作业

2.1 题目一:7-3 表达式转换

算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。

2.2 设计思路

/*表达式转换*/

定义运算符栈指针 *optr

定义字符串数组 exp 存储中缀表达式

定义字符串数组 polish 存储逆波兰表达式

while 从exp读取字符ch and ch!=\0'

if ch 为数字

then 将后续的所有数字均依次存放到 polish, 并以字符#标志数值串结束

if ch = ')'

then 将 optr 遇到第一个 ‘(' 以前的运算符出栈放入polish,并将 '(' 出栈

if ch = '+ ' or '-'

then 出栈运算符直至栈空或者栈顶为 ’( ‘ ,并存放到postexp中,将+'或-进栈

if ch = '*' or '/ '

then if 栈顶 = ' * ' 或 ' / '

then 出栈直到栈顶不是 ' * ' 或 ' / '

else 入栈

end

将 optr 中所有运算符依次出栈并存放到 polish 中

2.3 实验代码

转换函数

a7e9fb3ed62be163f313196316bd1860.png

04b5c9c683fc39049e30ea3b4696ad2c.png

f21cac53c083eb9ca78ed62dcdc8e598.png

输出函数

4ab55c502a45780d8338081ad9d3dc3f.png

2.4 遇到的问题及解决方法:

c5fb78aca87775ee092fc72260c22a80.png

格式错误:没有考虑到数字为多位数时的情况

解决方法:在一个连续数字输入后添加 ’#‘ 作为标识

答案错误:运算数前有正负号

解决方法:若 ’+‘ ’-‘ 号前不是数字,即为正负号,添加代码 if( '(' == *(exp-1) || '+' == *(exp-1) ||'-' == *(exp-1) ||'*' == *(exp-1) || '/' == *(exp-1)|| i==0 )进行判断

答案错误:有非整数情况出现

解决方法: 将 while( *exp >= '0' && *exp <= '9') 修改为while( *exp >= '0' && *exp <= '9' || '.' == *exp )

2.1 题目二:7-2 符号配对

请编写程序检查C语言源程序中下列符号是否配对:/与/、(与)、[与]、{与}。

2.2 设计思路

while true

按行输入并保存至字符串数组 str

if str[0] = ' . ' and str 的长度为1

then break

if str[i] 为 ' /* ' or ' ( ' or ' [ ' or ' { '

then 入栈

if str[i] 为 ’ */ ' or ' ) ' or ' ] ' or ' } '

then 出栈并判断是否匹配,不匹配时跳出循环

end

2.3 实验代码

e31a2ea2371fcccbbe0922623aecc3b9.png

764b9027d4084c3c7f6c0a9c4206198a.png

a268dbe65e687c9bbb66a4a0383a91be.png

90f0507cc6447ea80f2c06dad9d28fee.png

2.4 遇到的问题及解决方法:

31262a4177f8b8e35bd211b7b138423c.png

编译错误:函数在定义前没有先声明

解决方法:函数应该先声明再定义

答案错误:开头有多余左符号

解决方法:没有判断只输入一个符号的情况下的不匹配,添加代码进行判断

段错误:达到最大值,但不匹配

解决方法:定义的字符串数组过小,改为#define MAXSIZE 100

2.1 题目三:7-2 银行业务队列简单模拟

设某银行有A、B两个业务窗口,且处理业务的速度不一样,其中A窗口处理速度是B窗口的2倍 —— 即当A窗口每处理完2个顾客时,B窗口处理完1个顾客。给定到达银行的顾客序列,请按业务完成的顺序输出顾客序列。假定不考虑顾客先后到达的时间间隔,并且当不同窗口同时处理完2个顾客时,A窗口顾客优先输出。:

2.2 设计思路

for i=0 to n

if 客户为奇数

then 入 q1 队

else 入 q2 队

end

while q1 不空 and q2 不空

q1 出队两次并输出

q2 出队一次并输出

end

while q1 不空 or q2 不空

q1 or q2 逐个出队

end

2.3 实验代码

ffafd3fe2bb5bd62611627f1eba84535.png

1512dbd7b25e723fe9013b0d3fdfb8a2.png

2.4遇到的问题及解决方法:

e7323d60328392b55d61e8f9a811512d.png

答案错误:最小N

解决方法:没有判断 q1 第二次出队时是否为空,添加代码if( !q1.empty() ) { print(q1.front()); q1.pop(); }

格式错误:没有达到 数字间以空格分隔,但最后一个编号后不能有多余的空格 的要求

解决方法:通过百度了解,可以增加一个输出函数用于判断是否为首元素

3. 本周题目集的PTA最后排名

本次2个题目集总分:206

3.1栈PTA排名

983bab77d8295849d2d3b8549239553c.png

3.2队列PTA排名

e9156c1d854917c12cb4be7f4d1e2c46.png

3.3 我的总分:2分

4.阅读代码

使用两个队列实现一个栈:

具体代码实现

public class StackByTwoQueue {

private LinkedListqueue1 = new LinkedList();

private LinkedListqueue2 = new LinkedList();

/*

* 两个队列实现一个栈

* pop完成出栈操作,push完成入栈操作

*/

public void push(String obj) {

if(queue1.isEmpty()){

queue2.add(obj);

}

if(queue2.isEmpty()){

queue1.add(obj);

}

}

public String pop() {

//两个栈都为空时,没有元素可以弹出

if (queue1.isEmpty()&&queue2.isEmpty()) {

try {

throw new Exception("stack is empty");

} catch (Exception e) {

}

}

if(queue1.isEmpty()){

while(queue2.size()>1){

queue1.add(queue2.poll());

}

return queue2.poll();

}

if(queue2.isEmpty()){

while(queue1.size()>1){

queue2.add(queue1.poll());

}

return queue1.poll();

}

return null;

}

public static void main(String[] args) {

StackByTwoQueue stack = new StackByTwoQueue();

for(int i=0;i<10;i++){

stack.push(i+"");

}

for(int i=0;i<20;i++){

System.out.println(stack.pop());

}

}

}

此代码实现的时用两个队列来实现栈,网上关于这个题目的代码基本上都是c++,代码虽然不能完全理解,但思路还是可以明白的。将queue1 作为入队存储数据的功能,queue2 作为中转件,出队时先把 queue1 中数据取出然后加入到 queue2 中,出队之后再返回到 queue2 中。

18b0ab7228801d7f8860a5c313ba019b.png

5.代码Git提交记录截图

8bb41e7f8a68586edfc8594ee0636d8a.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值