1.学习总结
1.1 写出你认为本周学习中比较重要的知识点关键词:线性表、栈和队列(特殊的线性表)
1.2 使用思维导图将这些关键词组织起来。
2.PTA实验作业
本周要求挑选出3道题目书写设计思路、调试过程。设计思路使用伪代码描述。题目选做要求:
- 不能选函数题
- 编程题选3题
注意:本次及以后的作业代码均需提交到Git仓库进行保存与未来的检查,并在学习总结小节截图你的提交记录。请立刻规划好存放你代码的目录结构,每次写完一题提交一次。具体提交方式请参见本周学习总结。
2.1 题目1:7-1 jmu-字符串是否对称
2.2 设计思路(伪代码或流程图)
BEGIN 建栈 定义字符串变量str for(int i=0;i<栈长;i++)//入栈准备 push 入栈; for(int =0;i<栈长;i++)//栈元素依次出栈 push 出栈; 出栈对称匹配; if (出栈元素!=str[i]) 字符串不对称(no); else 字符串对称(yes); END
2.3 代码截图(注意,截图、截图、截图。代码不要粘贴博客上。不用用···语法去渲染)
2.4 PTA提交列表说明。
错误分析:1、先用C写的,发现string这个在C比较不会用,然后就用C++了;
2、部分正确是出栈时,一开始是用定义一个str2 =s1.pop时发现这是一个错误,
会导致无论什么情况都是no,所以直接从栈顶比对比较好,可见在对栈做一些
操作时,对栈顶的操作很重要!
题目2:7-3 表达式转换
设计思路(伪代码或流程图)
BEGIN
核心部分 读取字符元素 if(操作数) 出栈;输出; else if (操作符) if(“)”) 出栈,输出其他操作符; 直到 操作符==“(”; 出栈不输出; else //优先级比较; top>=当前字符; 出栈输出; 直至小于; //定义flag 用来做当前操作; END
代码截图(注意,截图、截图、截图。代码不要粘贴博客上。不用用···语法去渲染)
PTA提交列表说明。
错误分析:1、这题做了很久,最终的代码大部分都是参考别人的;
2、开始的时候用C写,写得差不多的时候,好不容易在DEV上过了,pta直接就报个不支持<stack>函数库;一直编译错误
3、不得不用C++,然而C++越写越乱,最后放弃了;
4、然后找大神教我用C写;才马马虎虎过了;
5、其实这个主要是抓住它的核心,要搞清几个情况的判断,这题我对栈的一点动态分析有一点进步。
题目3:7-1 jmu-报数游戏
设计思路(伪代码或流程图)
BEGIN 定义struct Queue; 创建 queue ; cin>>人数n; cin>>退出为此m; if n<m 输出 error; return 0; for (i=1;i<人数n;i++) 尾指针rear 编号 while (q) for(i=1;i<m;i++) 报数到m位置 头指针从1开始递增 尾指针run 循环 输出编号: END
代码截图(注意,截图、截图、截图。代码不要粘贴博客上。不用用···语法去渲染)
PTA提交列表说明。
这是啥错误啊??忽视了scanf的返回值,明明也有定义头文件。。
3.截图本周题目集的PTA最后排名
3.1 栈PTA排名
3.2 队列PTA排名
3.3 我的总分:130分 ——>2分
4. 阅读代码
#include <bits/stdc++.h> using namespace std; const int MAXN=1e5+10; const int inf=1e9; int n,m; int top,flag; char ans[MAXN]; char s[MAXN*10]; char sta[MAXN]; int main() { int cnt=0; while(gets(s)&&s[0]!='.') { int l=strlen(s); for(int i=0; i<l; ++i) { if(s[i]=='('||s[i]==')'||s[i]=='{'||s[i]=='}'||s[i]=='['||s[i]==']') { ans[cnt++]=s[i]; } else if(s[i]=='/'&&s[i+1]=='*') { ans[cnt++]='a'; i++; } else if(s[i]=='*'&&s[i+1]=='/') { ans[cnt++]='b'; i++; } } } //puts(ans); top=0; flag=1; int i; for(i=0; i<cnt; ++i) { if(ans[i]=='('||ans[i]=='['||ans[i]=='{'||ans[i]=='a') { sta[top++]=ans[i]; } else if(!top) { puts("NO"); printf("?-"); if(ans[i]=='b')printf("*/\n"); else printf("%c\n",ans[i]); flag=0; break; } else if(ans[i]-sta[top-1]!=1&&ans[i]-sta[top-1]!=2) { puts("NO"); if(sta[top-1]=='a')printf("/*"); else printf("%c",sta[top-1]); printf("-?\n"); flag=0; break; } else top--; } if(flag) { if(!top)puts("YES"); else { puts("NO"); if(sta[0]=='a')printf("/*"); else printf("%c",sta[0]); printf("-?\n"); } } return 0; }
他这个思路挺不错的:
首先就是把串全部读进来,合成一个大串,只保留括号即可。
然后再对新生成的串处理,读入左括号,直接压入栈顶。
如果读入的是右括号:
1.如果栈为空,那么缺少与之对应的左括号。、
2.如果栈顶元素与之不匹配,那么缺少与栈顶元素相匹配的右括号。
处理完之后,如果栈为空,则表示完全匹配,如果有剩余,那么就是缺少右括号。因为是输出第一个缺少的,所以直接输出栈尾的元素就可以。
5. 代码Git提交记录截图
https://gitee.com/zhqwang/hello-world/tree/master