题目链接:http://acm.zzuli.edu.cn/showproblem?problem_id=1530
偶登博客看有人做此题,便心血来潮想看看,发现诸位尽是用栈或者指针,发现甚是美观,但组织之乱,也不堪入目,于是便以拯救众生之心,想让代码尽量简单:
于是便有了极其简单的思路:
用栈的思想,极其简单的代码解决掉,废话少说,具体代码及注释如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<stdio.h> #include<string.h> #include<stdlib.h> int Q_num[1000];//////////用栈的思想存,模拟栈存转换为整数后的数据 char str[1000];/////////最原始的输入的字符串的存储位置 char Q_str[350][5];/////用栈的思想存,模拟栈存提取后的add,min,max char ch1[10],ch2[10];///临时转换站,ch1[]转换add,min,max ; ch2[]转换待转换的数值元素 int MIN(int a,int b)////////////当出现最小的时候返回最小的 { if(a>b) return b; else return a; } int MAX(int a,int b)//////最大的原理及应用同上 { if(a>b) return a; else return b; } int main() { int i,j,T,k,p,m1,s1,s2; scanf("%d",&T); getchar(); while(T--) { memset(Q_num,0,sizeof(Q_num)); gets(str); if(str[0]>='0'&&str[0]<='9') { puts(str); continue; } k=0; p=0; for(i=0;str[i]!='\0';i++) { if(str[i]=='a'||str[i]=='m') { j=0; while(str[i]>='a'&&str[i]<='z') { ch1[j]=str[i]; i++; j++; } strcpy(Q_str[k],ch1); k++; i--;////////////////////注意这里的i--,单步调试会有深刻了解 memset(ch1,0,sizeof(ch1)); } else if(str[i]>='0'&&str[i]<='9') { j=0; while(str[i]>='0'&&str[i]<='9') { ch2[j]=str[i]; i++; j++; } m1=atoi(ch2); Q_num[p]=m1; p++; i--;//////////////////////////////注意这里的i-- memset(ch2,0,sizeof(ch2)); } else if(str[i]==','||str[i]=='(') { continue; } else //////////其实此处的else 就是else if(str[i]==')'),因为在此时要对最顶端的2个元素处理了, { ///处理后提取出一个元素,存入Q_num[] s1=Q_num[p-1]; Q_num[p-1]=0; p--; s2=Q_num[p-1]; Q_num[p-1]=0; p--; if(strcmp(Q_str[k-1],"add")==0) { Q_num[p]=s1+s2; p++; strcpy(Q_str[k-1]," "); } else if(strcmp(Q_str[k-1],"min")==0) { Q_num[p]=MIN(s1,s2); p++; strcpy(Q_str[k-1]," "); } else if(strcmp(Q_str[k-1],"max")==0) { Q_num[p]=MAX(s1,s2); p++; strcpy(Q_str[k-1]," "); } k--; } } printf("%d\n",Q_num[0]); } return 0; }