第03次作业-栈和队列
1.学习总结
2.PTA实验作业
2.1题目1: jmu-字符串是否对称
2.2 设计思路
设计思路
while i小于len
c.push(s[i]) 将是s[i]入栈
i++;
for(i=0;i<=len/2;i++){
if(s[i]==c.top())
c.pop(); 如果s[i]等于c.top(),将栈顶弹出
j=1; 定义j=1 为字符串为对错
else
j=0;break;
否则 j=0 则字符串不对称 跳出循环不再进行对比
2.3代码截图
2.4PTA提交列表说明
错误点:提交时未更改pta的编译器,导致编译错误
2.1题目2:符号配对
2.2 设计思路
while(1)
if(ch[0] == '.' && strlen(ch) == 1) 跳出while循环
输入字符串ch
int len = strlen(ch);
for( i = 0; i < len; i++)
if(ch[i]=='/'||ch[i]=='*'||ch[i]=='{'||ch[i]=='}'||ch[i]=='['||ch[i]==']'||ch[i]=='('||ch[i]==')') S->Data[S->Top++]=ch[i];如果ch[i]等于{、}、/、*、[、]、(、),入栈;
if(S->Top>100) S->Top=100;如果栈的长度超过100,则定义为100;
for(i=0;i<S->Top;i++)
如果S->Data[i]=='(' m[0]++ Sign[0]='('
如果S->Data[i]==')' m[1]++ Sign[0]=')'
如果S->Data[i]=='[' m[2]++ Sign[0]='['
如果S->Data[i]==']' m[3]++ Sign[0]=']'
如果S->Data[i]=='{' m[4]++ Sign[0]='{'
如果S->Data[i]=='}' m[5]++ Sign[0]='}'
如果S->Data[i]=='/'与S->Data[i+1]=='*' m[6]++ i++
如果S->Data[i]=='*'与S->Data[i+1]=='/' m[6]++ i++
定义a=-1
for(i=0;i<=6;i+=2)
if(m[i]>m[i+1]) a=i;
else if(m[i]<m[i+1]) a=i+1;
如果a=-1 则字符串对称
如果a%2==0 输出相应符号-?
a%2!=0 输出?-%c相应符号
a=6 输出/*-?
a=7输出?-*/
2.3代码截图
2.4PTA提交列表说明
错误点 测试点最后一点未正确,得出超出范围的符号便可以得出哪个缺少配对符号
2.1题目3:银行业务队列简单模拟
2.2 设计思路
定义队列 A,B;
InitQueue(A);初始化队列A
InitQueue(B);初始化队列B
int n,i,m,j;
cin>>n;
for(i=0;i<n;i++)
cin>>m;
if(m%2==0) AddQueue(B,m);如果m是奇数输入到B队列中
else if(m%2==1) AddQueue(A,m);m是偶数输入到A队列中
i=0;
while(i!=n)
if(A->front<A->rear)
PrintQueue(A,i);如果A队列不为空 出列
j++;A队列处理完人数加一
i++;总处理人数加一
if(j>0&&j%2==0&&(B->front<B->rear))
PrintQueue(B,i); 当A队列处理完两个人后且B队列不为空 出列
i++;总处理人数加一
else if(B->front<B->rear)
PrintQueue(B,i); B队列不为空 出列
i++;总处理人数加一
DestroyQueue(A);销毁队列A
DestroyQueue(B);销毁队列B
2.3代码截图
2.4PTA提交列表说明
错误点:pta编译器未改正,输出队列时尾部出现空格 后改用i来控制位置判断是否输出空格,传递参数使用错误
3.截图本周题目集的PTA最后排名
3.1 栈PTA排名
3.2 队列PTA排名
3.3 我的总分:2
4. 阅读代码
#include<bits/stdc++.h> struct priority{ char ch; int pri; }lpri[]={{'(',1},{'+',3},{'-',3},{'/',5},{'*',5},{')',6}}, rpri[]={{'(',6},{'+',2},{'-',2},{'/',4},{'*',4},{')',1}}; bool Operator(char ch1,char ch2){ if(ch2=='('||ch2==')'||ch2=='*'||ch2=='/') return true; if(ch2=='-'&&((ch1>='0'&&ch1<='9')||ch1==')')) return true; if(ch2=='+'&&((ch1>='0'&&ch1<='9')||ch1==')')) return true; return false; } int leftpri(char op){ int i; for(i=0;i<6;i++) if(lpri[i].ch==op)return lpri[i].pri; } int rightpri(char op){ int i; for(i=0;i<6;i++) if(rpri[i].ch==op)return rpri[i].pri; } using namespace std; int main(){ stack<char>s; char a[1000],res[1000]; int k=0,i=0,flag=0,mark=0; gets(a); if(a[0]=='-'||a[0]=='+'){ res[k++]=a[0]; i++; } while(a[i]>='0'&&a[i]<='9'){ res[k++]=a[i]; i++; mark=1; } if(mark) res[k++]='#'; while(a[i]){ if(a[i]=='('){ s.push(a[i++]); } if(a[i]==')'){ while(s.top()!='('){ if(s.top()!='('&&s.top()!=')') res[k++]=s.top(); if(res[k-1]!='#') res[k++]='#'; s.pop(); } i++; s.pop(); } while((!s.empty()&&Operator(a[i-1],a[i]))&&rightpri(a[i])<leftpri(s.top())){ if(!a[i])break; if(s.top()!='('&&s.top()!=')') res[k++]=s.top(); else s.pop(); if(res[k-1]!='#') res[k++]='#';s.pop(); flag=1; } if(flag){ s.push(a[i]); i++; flag=0; } while(Operator(a[i-1],a[i])&&(s.empty()||rightpri(a[i])>leftpri(s.top()))){ if(!a[i])break; s.push(a[i]); i++; } while(!Operator(a[i-1],a[i])){ if(!a[i])break; if(a[i]=='-'&&(a[i-1]>='0'&&a[i-1]<='9')) if(res[k-1]!='#') res[k++]='#'; else if(a[i]=='+'&&(a[i-1]>='0'&&a[i-1]<='9')) if(res[k-1]!='#') res[k++]='#'; if(a[i]!='('&&a[i]!=')') res[k++]=a[i]; i++; } if(res[k-1]!='#') res[k++]='#'; } while(!s.empty()){ if(s.top()!='('&&s.top()!=')'){ res[k++]=s.top(); s.pop(); } else s.pop(); if(res[k-1]!='#') res[k++]='#'; } res[k]='\0'; for(i=0;i<k-1;i++){ if(res[i]=='+'&&(res[i+1]>='0'&&res[i+1]<='9')) i++; if(res[i]=='#') printf(" "); else printf("%c",res[i]); }; return 0; }
优点:运用了#include<bits/stdc++.h>头文件节约了代码长度,不必再一个一个打出来