这里会显示出您选择的修订版和当前版本之间的差别。
| 两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 | ||
|
2020-2021:teams:no_morning_training:week1 [2020/05/09 22:55] shaco |
2020-2021:teams:no_morning_training:week1 [2020/06/05 15:27] (当前版本) shaco ↷ 链接因页面移动而自动修正 |
||
|---|---|---|---|
| 行 25: | 行 25: | ||
| ==== 专题 ==== | ==== 专题 ==== | ||
| - | * [[2020-2021:teams:no_morning_training:尺取法|尺取法]] | + | * [[2020-2021:teams:no_morning_training:shaco:知识点:基础:尺取法|尺取法]] |
| - | * [[2020-2021:teams:no_morning_training:前缀和|前缀和]] | + | * [[2020-2021:teams:no_morning_training: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; | + | |
| - | } | + | |