第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>头文件节约了代码长度,不必再一个一个打出来

 

posted @ 2018-04-07 20:59  颜骏棋  阅读(148)  评论(2编辑  收藏  举报