计算(calc.cpp)

【问题描述】

小明在你的帮助下,破密了Ferrari设的密码门,正要往前走,突然又出现了一个密码门,门上有一个算式,其中只有“(”,“)”,“0-9”,“+”,“-”,“*”,“/”,“^”求出的值就是密码。小明数学学得不好,还需你帮他的忙。(“/”用整数除法)

【输入】

输入文件calc.in共1行,为一个算式。

【输出】

输出文件calc.out共1行,就是密码。

【输入样例】calc.in

1+(3+2)*(7^2+6*9)/(2)

【输出样例】calc.out

258

【限制】

100%的数据满足:算式长度<=30 其中所有数据在2^31-1的范围内。

用栈来处理运算顺序。把数和符号存在不同的栈中。每次读到数后检查已经入栈的运算符号,能算的就先算完。

如读到'^',直接算出乘方结果压入栈中,而读到'*''/'要先检查下一个符号是不是'^',不是的话才能算结果,加减同理……

以下的代码有一个已知的小bug:不支持自动消除空格(懒得写)读入的时候要是有空格,程序会爆炸。

代码(未使用STL):

 #include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
int a[];//数栈
int p,i;
char sy[],c[];//符号栈 原算式
9 void push(){
sy[++p]=c[i];
}
void pp(){//弹栈运算
switch(sy[p--]){
case '+':a[p]+=a[p+];break;
case '-':a[p]-=a[p+];break;
case '*':a[p]*=a[p+];break;
case '/':a[p]/=a[p+];break;
case '^':a[p]=pow(a[p],a[p+]);break; }
return;
}
int can(){//优先级判断
if((c[i]=='+'||c[i]=='-') && sy[p]!='(')return ;
if((c[i]=='*'||c[i]=='/') && (sy[p]=='*' || sy[p]=='/'))return ;
return ;
}
int main(){
p=;i=;
cin>>c;
c[strlen(c)]=')';
sy[p]='(';
//
printf("test");
while(i<strlen(c)){
while(c[i]=='('){//处理左括号
push();
i++;
}
int x=;
while(c[i]>=''&& c[i]<=''){//处理数字
x=x*+c[i++]-'';
}
a[p]=x;
do{
if(c[i]==')'){//处理右括号
while(sy[p]!='(')pp();
a[--p]=a[p+]; }
else{
while(can())pp();
push();
}
i++;
}while(i<strlen(c) && c[i-]==')'); }
printf("%d",a[p]);
return ;
}

代码(STL):

STL真好用

 /**/
#include<iostream>
#include<algorithm>
#include<cmath>
#include<stack>
#include<cstring>
using namespace std;
char c[]; stack<int>num;//数
stack<char>sy;//符号
int pow1(int a,int b){//自写乘方
int i;
for(i=;i<=b;i++){
a*=a;
}
return a;
}
void mth(){//运算
int a,b;
char ch;
b=num.top();
num.pop();
a=num.top();
num.pop();
ch=sy.top();
sy.pop();
switch(ch){
case '+': num.push(a+b);break;
case '-': num.push(a-b);break;
case '*': num.push(a*b);break;
case '/': num.push(a/b);break;
case '^': num.push(pow1(a,b));break;
default: break;
}
return;
}
int cmp(int ch){//优先级判断,没有严谨验证过,初步测试没有问题 //注释掉的那部分代码来自大神yhy,保证无误
if(sy.empty() || sy.top()=='(')return ;
if(ch=='+' || ch=='-')return ;
if(sy.top()=='^')return ;
if((ch=='*' || ch=='/') && (sy.top()=='*' ||sy.top()=='/'))return ;
return ;
/* if (sy.empty()||sy.top()=='(') return 0;
if (sy.top()=='^') return 1;
if (ch=='^') return 0;
if (sy.top()=='*'||sy.top()=='/') return 1;
if (ch=='*'||ch=='/') return 0;
return 1;*/
}
int main(){
gets(c);
int len=strlen(c);
c[len]=')';
sy.push('(');
int i;
for(i=;i<=len;i++){
if(c[i]=='('){
sy.push('(');
continue;
}
if(c[i]>='' && c[i]<='')
{
int x=;
while(c[i]>='' && c[i]<=''){
x=x*+c[i]-'';
i++;
}
i--;
num.push(x);
continue;
}
if(c[i]==')'){
while(sy.top()!='(')mth();
sy.pop();
continue;
}
while(cmp(c[i]))mth();
sy.push(c[i]);
}
while(!sy.empty())mth();
printf("%d ",num.top());
return ;
}

calc 多项式计算 (STL版和非STL版) -SilverN的更多相关文章

  1. [C++]竞赛模板·数据统计与IO(重定向版与非重定向版)

      /* 数据统计与IO 重定向版模板 描述:本机测试用文件数据流重定向,一旦提交到比赛就自动“删除”重定向语句 */ # define LOCAL #include<stdio.h> # ...

  2. java二叉树遍历——深度优先(DFS)与广度优先(BFS) 递归版与非递归版

    介绍 深度优先遍历:从根节点出发,沿着左子树方向进行纵向遍历,直到找到叶子节点为止.然后回溯到前一个节点,进行右子树节点的遍历,直到遍历完所有可达节点为止. 广度优先遍历:从根节点出发,在横向遍历二叉 ...

  3. Eclipse下创建Spring MVC web程序--非maven版

    首先, 安装eclipse和tomcat, 这里我下载的是tomcat9.0版本64位免安装的:地址https://tomcat.apache.org/download-90.cgi 免安装的如何启动 ...

  4. stl文件格式解析代码--java版

    代码是参考three.js中的stlLoader.js写的. 需要注意的地方,java中byte取值-128~127 package test_stl.test_entry; import java. ...

  5. 队列问题非STL解决方案

    队列问题非STL解决方案 常年使用STL解决队列问题,以至于严重生疏队列的根本原理... 直到今日 被老师被迫 使用算法原理解决问题,方才意识到我对队列一窍不通... ...直到 经过一系列的坑蒙拐骗 ...

  6. 标准非STL容器 : bitset

    1. 概念 什么是"标准非STL容器"?标准非STL容器是指"可以认为它们是容器,但是他们并不满足STL容器的所有要求".前文提到的容器适配器stack.que ...

  7. UOJ34 多项式乘法(非递归版)

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  8. MATLAB学习笔记(六)——MATLAB数据分析与多项式计算

    (一)数据处理统计 一.最大值和最小值 1.求向量的最大值和最小值 y=max(X); %返回向量X的最大值存入y,如果X中含有复数则按模最大的存入y [y,I]=max(X);%返回向量X的最大值存 ...

  9. 泛型编程、STL的概念、STL模板思想及其六大组件的关系,以及泛型编程(GP)、STL、面向对象编程(OOP)、C++之间的关系

    2013-08-11 10:46:39 介绍STL模板的书,有两本比较经典: 一本是<Generic Programming and the STL>,中文翻译为<泛型编程与STL& ...

随机推荐

  1. FreeBSD 9.1安装KMS 这是一个伪命题###### ,9....

    FreeBSD 9.1安装KMS 这是一个伪命题###### ,9.1的内核已经加入了KMS内核支持 需要更新ports中的xorg到打了补丁的版本,无意中发现了一个pkg源,这个事也搞定了 free ...

  2. Java多线程--wait(),notify(),notifyAll()的用法

    忙等待没有对运行等待线程的 CPU 进行有效的利用(而且忙等待消耗cpu过于恐怖,请慎用),除非平均等待时间非常短.否则,让等待线程进入睡眠或者非运行状态更为明智,直到它接收到它等待的信号. Java ...

  3. 编写运行R脚本

    1.在后台运行R 1.1 创建file.R文件 1.2 在文件首行键入: #! /path/to/Rscript 1.3 在下面的行中,键入R代码 1.4 保存(记得有png(),jpeg(),... ...

  4. js判断客户端平台

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. 关于使用ResultSet ---结果集没有当前行

    Resultset返回的结果集是从结果的前一句开始的,也就是说一开始的resultset是没有的,所以,一般使用的时候,需要这样子写:      while( resultSet.next() ){ ...

  6. 纯CSS仿windows系统loading效果

    今天分享的css3案例模仿了window系统下的loading效果里面最关键的地方使用了css3 animation的delay属性以及贝塞尔曲线(cubic-bezier)的过渡效果,如下所示 sp ...

  7. Study Tips

    1. 100% width divs not spanning entire width of the browser in webkit. Even Body can not span the en ...

  8. ABAP内表(internal table)有关的系统变量

    SY-TABIX – 内表当前行的索引号.SY-TABIX 的值可以被以下命令修改,但是只适用于索引表(index table).对于哈希表(Hashed table),这个系统变量的值为空或0. A ...

  9. Fix Internet Explorer Crashes with SharePoint 2013 Online Presence Indicators

    IE中,只要是鼠标浮动到人名字上面的状态的时候,这个状态是与Lync相连接的,IE就会出现停止工作. 以下是解决方法. Until the other day when I figured this ...

  10. 浅谈Hex编码算法

    一.什么是Hex 将每一个字节表示的十六进制表示的内容,用字符串来显示. 二.作用 将不可见的,复杂的字节数组数据,转换为可显示的字符串数据 类似于Base64编码算法 区别:Base64将三个字节转 ...