Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

又加了一点注释 能不能帮忙看看 或是给个出错的数据 谢了

Posted by nestle at 2005-06-15 22:14:20 on Problem 2106
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:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator