Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
又加了一点注释 能不能帮忙看看 或是给个出错的数据 谢了In Reply To:这个谁都知道,但谁都不知道你的代码哪一块干哪些事的 Posted by:frkstyc at 2005-06-15 22:03:30 #include <iostream> #include <cstdio> #include <cstring> #include <map> using namespace std; int operater[200]; //1 int operand[200]; //2 map <char,int> isp; //栈内优先数 map <char,int> icp; //栈外优先数 char f[2]={'F','V'}; int top1; //运算符栈的栈顶 int top2; //运算数栈的栈顶 void init(){ isp['(']=1; isp['&']=5; isp['|']=3; isp['!']=6; isp[')']=8; icp['(']=8; icp['&']=4; icp['|']=2; icp['!']=7; icp[')']=1; return ; } //初始化优先数 void cal(char c){ int num,left,right; if(c=='!'){ num=operand[--top2]=='V'?1:0; operand[top2++]=f[!num]; } //单目运算 只要取一个数 else { right=operand[--top2]=='V'?1:0; left=operand[--top2]=='V'?1:0; if(c=='|'){ operand[top2++]=f[left||right]; } else if(c=='&'){ operand[top2++]=f[left&&right]; } } //双目运算,取两个数 return ; } //运算 int main(){ init(); int kase=0; char ch; while((ch=getchar())!=EOF){ top1=top2=0; while(1){ if(ch=='\n'||ch==EOF) break; if(ch==' '){ ch=getchar(); continue; } //如果读入空格就继续读 else if(ch=='V'||ch=='F'){ operand[top2++]=ch; ch=getchar(); }//V或F就进操作数的栈 else { if(top1&&icp[ch]<isp[operater[top1-1]]){ cal(operater[--top1]); } //操作符优先级小于 栈顶 对栈顶进行运算 else if(top1&&icp[ch]==isp[operater[top1-1]]){ --top1; ch=getchar(); } //相等 抵消 主要是左右括号 else{ operater[top1++]=ch; ch=getchar(); } //操作符入栈 //运算符进行处理 } } if(ch=='\n'){ while(top1){ cal(operater[--top1]); } //将操作符里的操作符全部运算掉 printf("Expression %d: %c\n",++kase,operand[top2-1]); } else if(ch==EOF) break; } return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator