欢迎使用本站,预祝练习时长两年半的选手们到成功! [本模块信息来自tem/def/head]

class08 zhc 车厢调度 后缀表达式

时间:2024-05-19 09:59 作者:admin 点击:
车厢调度1357改版 输入车厢数量,a站进站顺序,以及b站出站顺序 输出能否按照b要求的顺序输出,yes或no 输入: 5 1 2 3 4 5 5 4 3 2 1 输出: yes //车厢调度问题 int a[10050],b[10050],c[10050]; int

车厢调度1357改版

输入车厢数量,a站进站顺序,以及b站出站顺序

输出能否按照b要求的顺序输出,yes或no

输入:

5

1 2 3 4 5

5 4 3 2 1

输出:

yes

//车厢调度问题

int a[10050],b[10050],c[10050];

int n,b=0,t=0;

int you(int x,int j){

   for(int i=j;i<n;i++){

       if(a[i]==x) return i;

   }

   return -1;

}

int main(){

   cin>>n;

   for(int i=0;i<n;i++) cin>>a[i];

   int j=0;

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

       cin>>b[i];

       //1、如果栈空,先进栈一辆车

       if(t==b) c[t++]=a[j++];

       //2、如果当前栈顶符合要求,出栈,下一个车厢

       if(c[t-1]==b[i]) t--;

       //否则 查找a栈是否有这个车厢

       else{

           /*如果有,这个车厢及前面所有车厢入栈,再出栈一次

           否则,no 结束*/

           int k=you(b[i],j);

           if(k>=0){

               while(b[i]!=a[j]){

                   c[t++]=a[j++];

               }

               c[t++]=a[j++];t--;

           }

           else{

               cout<<"no";

               return 0;

           }

       }

   }

   cout<<"yes";

   return 0;

}


后缀表达式问题

中缀,前缀,后缀

中缀:正常的数学表达式     1+2  1+3*5   (1-6)*4

前缀:符号在前的数学表达式  +12  +1*35   *-164

后缀:符号在后的数学表达式  12+  135*+   16-4*

中缀转后缀标准版

1+3*(4-5)/6+7

1、根据符号计算顺序加括号

((1+((3*(4-5))/6))+7)

2、从里到外依次去括号

((1+((3*(45-))/6))+7)

((1+((345-*)/6))+7)

((1+(345-*6/))+7)

((1345-*6/+)+7)

(1345-*6/+7+)

1345-*6/+7+


1、输入一个中缀,输出后缀

遇到数字,正常输出

遇到符号,先入栈,后输出

//无括号

char c[10000];

int t=0,b=0;

for(int i=0;i<s.size();i++){

   if(s[i]>='0'&&s[i]<='9') cout<<s[i];

   else{

       while(t!=b&&yxj(c[t-1])>=yxj(s[i])){

           cout<<c[t-1];

           t--;

       }

       c[t++]=s[i];

   }

}

while(t!=b){

   cout<<c[t-1];

   t--;

}

//有括号

char c[10000];

int t=0,b=0;

for(int i=0;i<s.size();i++){

   if(s[i]>='0'&&s[i]<='9') cout<<s[i];

   else if(s[i]=='(') c[t++]=s[i];

   else if(s[i]==')'){

       while(c[t-1]!='('){

           cout<<c[t-1];

           t--;

       }

       t--;

   }

   else{

       while(t!=b&&c[t-1]!='('&&yxj(c[t-1])>=yxj(s[i])){

           cout<<c[t-1];

           t--;

       }

       c[t++]=s[i];

   }

}

while(t!=b){

   cout<<c[t-1];

   t--;

}

优先级处理: string yxj="+-*/";//01 23   [/2处理同级]



2、输入一个后缀,输出计算结果

遇到数字,入栈

遇到符号,出栈两位,计算再入栈

最后输出栈顶即结果

int js(int a,int b,char c){

   switch(c){

       case '+': return b+a;

       case '-': return b-a;

       case '*': return b*a;

       case '/': return b/a;

   }

   return 999999999;

}

int m[1000],t=0,b=0;

for(int i=0;i<s.size();i++){

   if(s[i]>='0'&&s[i]<='9') m[t++]=s[i]-48;

   else{

       int a=m[t-1];t--;

       int b=m[t-1];t--;

       m[t++]=js(a,b,s[i]);

   }

}

cout<<m[t-1];



3、输入一个中缀,输出计算结果

分别创建数字栈,符号栈

遍历中缀表达式,遇到数字,进数字栈

遇到左括号,进符号栈

遇到右括号,符号栈出栈,出栈时,数字栈参与计算,直到左括号为止

遇到符号,通过优先级符号栈出栈,数字栈参与计算

栈顶即结果


课下任务:

1、通过3流程,完成算法结构

2、1331题


#include <stack>    //栈的工具包,容器,严格按照栈的规律进行入栈出栈控制

//创建栈

stack<数据类型> 变量名;

stack<int> s;

//使用栈,调用函数

s.push(5);//数据 5 入栈

s.push(3);

s.push(7);

s.push(4);

cout<<s.top();//输出栈顶元素 4

s.pop();//出栈

s.empty();//判断栈空,栈空返回true,栈不空返回false

while(!s.empty()){

   cout<<s.top();

   s.pop();

}


3、利用stack工具包对今天的代码进行改编

(责任编辑:admin)
    顶一下
    (0)
    0%
    踩一下
    (0)
    0%