计算(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. csharp: Data binding in WPF DataGrid control

    <Window x:Class="WpfProjectDemo.MainWindow" xmlns="http://schemas.microsoft.com/wi ...

  2. Linux守护进程实现程序只运行一次

    1.守护进程 守护进程(Daemon)是一种运行在后台的特殊进程,它独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件. 2.让程序只运行一次 如果让程序只运行一次,有很多方法,此处的一种 ...

  3. AC自动机---病毒侵袭持续中

    HDU 3065 题目网址: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=110773#problem/C Description 小t ...

  4. EffectiveJava——用函数对象表示策略

    有些语言支持函数指针.代理.lambda表达式,或者支持类似的机制,允许程序把“调用特殊函数的能力”储存起来并传递这种能力.这种机制通常用于允许函数的调用者通过传入第二个函数,来指定自己的行为.比较器 ...

  5. 在博客中使用MathJax写数学公式

    前言 总结一些在博客园使用MathJax写数学公式的经验. 博客园 设置使用数学公式 进入你的博客:管理 > 选项 里面有个启用数学公式支持,选上后保存. 这时,你就可以在你的博客里写数学公式了 ...

  6. ASP.NET Boilerplate 深入系列之:概述

    因为项目需要,最近个人购买了一直在研究的ABP框架的一个Regular Licience,马上要用到一个实际的项目中,为了能够准确把握该框架涉及到设计思想.使用模式.内在实现细节.准备在接下来的一个月 ...

  7. C语言动态调用库(转)

    转自:http://cloverprince.iteye.com/blog/481309 现有一个主程序用C语言写成.现在要允许第三方开发人员编写扩展的模块,约定第三方开发的模块必须提供一系列已知名称 ...

  8. django使用笔记

    django的具体使用可以看官方手册http://djangobook.py3k.cn,这里主要记录使用django中遇到的问题. 1.中文编码问题. 因为我们用到的东西基本上都有中文,在settin ...

  9. XML的约束(dtd)

    DTD(Document Type Definition),文档类型定义,DTD文件应使用UTF-8或Unicode   1.XML中有多少个元素,就在dtd文件中写几个 <!ELEMENT&g ...

  10. android 事件

    package com.example.yanlei.my2; import android.app.Activity; import android.content.Context; import ...