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 CCUT_king at 2018-02-28 12:19:43 on Problem 2106
#include <iostream>
#include <stack>
#include <string>
#include <cstdio>
using namespace std;
int main()
{
    string s;
    int kase=1;
    //freopen("Atext.in","r",stdin);
    while(getline(cin,s)){
        int x,y,c;
        stack<int> val;
        stack<char> op;
        for(int i=0;i<s.size();i++){
            switch(s[i])
            {
            case '(':
                op.push(s[i]);
                break;
            case '!':       //注意如:!!!F,一开始没处理好RE了;
                if(!op.empty()&&op.top()=='!'){
                    op.pop();//注意!为单目运算符,一开始没处理好!
                }else
                    op.push(s[i]);
                break;
            case '|':
            case '&':
            case ')':
                while(!op.empty()){
                    if(op.top()=='!'){
                    x=val.top();
                    val.pop();
                    val.push((!x));
                    op.pop();
                    }else if(op.top()=='|')
                    {
                        x=val.top();
                        val.pop();
                        y=val.top();
                        val.pop();
                        val.push((x|y));
                        op.pop();
                    }else if(op.top()=='&')
                    {
                        x=val.top();
                        val.pop();
                        y=val.top();
                        val.pop();
                        val.push((x&y));
                        op.pop();
                    }else
                        break;
                }
                if(s[i]==')')
                    op.pop();
                else
                    op.push(s[i]);
                break;
            case 'V':
                val.push(1);
                break;
            case 'F':
                val.push(0);
                break;
            default :
                break;
            }
        }
        while(!op.empty()){
                if(op.top()=='!'){
                x=val.top();
                val.pop();
                val.push((!x));
                op.pop();
            }else if(op.top()=='|')
            {
                x=val.top();
                val.pop();
                y=val.top();
                val.pop();
                val.push((x|y));
                op.pop();
            }else if(op.top()=='&')
            {
                x=val.top();
                val.pop();
                y=val.top();
                val.pop();
                val.push((x&y));
                op.pop();
            }
        }
       // cout << val.size() << endl;
        //cout << op.size() << endl;
        printf("Expression %d: ",kase++);
        if(val.top()==1)
            printf("V\n");
        else
            printf("F\n");
    }
    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