zoukankan      html  css  js  c++  java
  • 表达式求值

    NOIP2013普及组初赛 第二题 表达是求值

    这道题考察对表达式的处理能力,只有+和*两种符号,比较简单

    但格式是通用的

    #include<cstdio>

    #include<iostream>
    #include<cstring>

    #include<string>
    using namespace std;
    string s;
    int num[100001],ni=0,si=1,i=0,w=10000;
    char sym[100001];
    void push()
    {
      sym[++si]=s[i];
    }
    void pop()
    {
      switch(sym[si--])
      {
        case'+':num[--ni]+=num[ni+1];num[ni]%=w;break;
        case'*':num[--ni]*=num[ni+1];num[ni]%=w;break;
      }
    }
    bool can()                    //判断优先级
    {
      if(s[i]=='+'&&sym[si]!='(') return 1;
      if(s[i]=='*'&&sym[si]=='*') return 1;
      return 0;
    }
    main()
    {
      cin>>s;
      s[s.size()]=')';
      sym[si]='(';
      while(i<s.size())
      {
        while(s[i]=='(')              //左括号处理
        {
          push();i++;
        }
        int x=0;                    //取数处理
        while(s[i]>='0'&&s[i]<='9')
        {
          x=x*10+s[i++]-'0';
          if(x>=w)x%=w;
        }
        num[++ni]=x;
        do
        {
          if(s[i]==')')            //右括号处理
          {
            while(sym[si]!='(')
            pop();
          }
        else
        {               //根具标志函数优先级来作运算符入栈或栈运算处理  
          while(can()) pop();   
          push();
        }
        i++;
        }while(i<s.size()&&s[i-1]==')');
      }
      printf("%d",num[1]%w);
      return 0;
    }

  • 相关阅读:
    FileInputStream 小Demo
    GUI线程 :打字母游戏
    联合线程(案例顾客买蛋糕 :使用join()方法)
    多线程:竞赛
    线程:交通灯
    猜数字游戏
    正则表达式
    音频播放的三种方式:
    进阶篇-用户界面:7.android动画-自定义视图动画
    进阶篇-用户界面:6.android studio使用github开源库实现下拉刷新
  • 原文地址:https://www.cnblogs.com/lwhinlearning/p/5661698.html
Copyright © 2011-2022 走看看