用户工具

站点工具


2020-2021:teams:no_morning_training:week1

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
后一修订版
前一修订版
2020-2021:teams:no_morning_training:week1 [2020/05/15 19:33]
shaco
2020-2021:teams:no_morning_training:week1 [2020/06/05 15:27] (当前版本)
shaco ↷ 链接因页面移动而自动修正
行 36: 行 36:
  
 ==== 王瑞琦 ==== ==== 王瑞琦 ====
-给出一个以=结尾的包含+-*/​%()的式子,按运算规则计算其值。 +一个模板题,[[2020-2021:teams:no_morning_training:表达式的计算]]
- +
-给出的式子是中缀表达式,将其转化为后缀表达式求解。 +
- +
-转换方法: +
- +
-用队列存储运算符,栈辅助处理。对每个字符,规则如下: +
- +
-1)若为数字,直接入队(当然,多位数字要提前处理一下) +
- +
-2)若为运算符: +
- +
-   ​1.栈为空直接入栈 +
-    +
-   ​2.优先级大于栈顶元素入栈 +
-    +
-   ​3.优先级小于等于栈顶元素,则栈顶元素出栈入队,直到优先级大于栈顶元素。 +
-    +
-3)若为(,直接入栈 +
- +
-4)若为),栈顶元素出栈入队,直到(,两个括号不入队。 +
- +
-计算方法: +
- +
-对于一个后缀表达式,用栈辅助计算 +
- +
-从左至右扫描,若为数字,直接入栈,若为运算符,则将栈顶两个元素计算,计算结果入栈。 +
- +
-直到最后留下一个数字即为结果。 +
- +
-  #include <​stdio.h>​  +
-  #include <​string.h> ​    +
-  #include <​stdlib.h> ​    +
-  char stack[500]; +
-  int queue[500];​ +
-  void calcu(int r,int top) +
-  { +
-   ​  ​ switch (stack[top]){ +
-     case '​+':​queue[r-1]=queue[r]+queue[r-1];​break;​ +
-   case '​-'​:queue[r-1]=queue[r-1]-queue[r];​break;​ +
-   case '​*'​:queue[r-1]=queue[r]*queue[r-1];​break;​ +
-   case '/'​:queue[r-1]=queue[r-1]/​queue[r];​break;​ +
-   case '​%':​queue[r-1]=queue[r-1]%queue[r];​break;​ +
-   } +
-  } +
-  int main() +
-  { +
-          char s[500]; +
-   int pr[300]={0};​ +
-   pr[(int)'​+'​]=pr[(int)'​-'​]=1;​ +
-   pr[(int)'​*'​]=pr[(int)'/'​]=pr[(int)'​%'​]=2;​ +
-   pr[(int)'​('​]=0;​ +
-   gets(s); +
-   int top=0,​r=0,​i=0;​  +
-   while (s[i]!='​='​) +
-   {  +
-     if (s[i]>​='​0'&&​s[i]<​='​9'​)  +
-   { +
-   int x=(int)s[i]-48;​ +
-   i++; +
-   while (s[i]>​='​0'&&​s[i]<​='​9'​)  +
-   { +
-   x=x*10+(int)s[i]-48;​ +
-   i++; +
-   } +
-   queue[++r]=x;​ +
-   i--; +
-   } +
-   else if (s[i]!='​('&&​s[i]!='​)'&&​s[i]!='​ '){ +
-   if (top==0) stack[++top]=s[i];​ +
-   else { +
-   if (pr[(int)s[i]]>​pr[(int)stack[top]]) stack[++top]=s[i];​ +
-   else { +
-   while (top!=0&&​pr[(int)s[i]]<​=pr[(int)stack[top]]) calcu(r--,​top--);​ +
-   stack[++top]=s[i];​ +
-   } +
-   } +
-   } +
-   else if (s[i]=='​('​) stack[++top]=s[i];​ +
-   else if (s[i]=='​)'​) { +
-   while (stack[top]!='​('​) calcu(r--,​top--);​ +
-   top--; +
-   } +
-   i++; +
-   } +
-   for (int i=top;​i>​=1;​i--) calcu(r--,​top--);​ +
-   printf("​%d",​queue[1]); +
-   return 0; +
-  }+
  
  
2020-2021/teams/no_morning_training/week1.1589542428.txt.gz · 最后更改: 2020/05/15 19:33 由 shaco