calc 多项式计算 (STL版和非STL版) -SilverN
计算(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的更多相关文章
- [C++]竞赛模板·数据统计与IO(重定向版与非重定向版)
/* 数据统计与IO 重定向版模板 描述:本机测试用文件数据流重定向,一旦提交到比赛就自动“删除”重定向语句 */ # define LOCAL #include<stdio.h> # ...
- java二叉树遍历——深度优先(DFS)与广度优先(BFS) 递归版与非递归版
介绍 深度优先遍历:从根节点出发,沿着左子树方向进行纵向遍历,直到找到叶子节点为止.然后回溯到前一个节点,进行右子树节点的遍历,直到遍历完所有可达节点为止. 广度优先遍历:从根节点出发,在横向遍历二叉 ...
- Eclipse下创建Spring MVC web程序--非maven版
首先, 安装eclipse和tomcat, 这里我下载的是tomcat9.0版本64位免安装的:地址https://tomcat.apache.org/download-90.cgi 免安装的如何启动 ...
- stl文件格式解析代码--java版
代码是参考three.js中的stlLoader.js写的. 需要注意的地方,java中byte取值-128~127 package test_stl.test_entry; import java. ...
- 队列问题非STL解决方案
队列问题非STL解决方案 常年使用STL解决队列问题,以至于严重生疏队列的根本原理... 直到今日 被老师被迫 使用算法原理解决问题,方才意识到我对队列一窍不通... ...直到 经过一系列的坑蒙拐骗 ...
- 标准非STL容器 : bitset
1. 概念 什么是"标准非STL容器"?标准非STL容器是指"可以认为它们是容器,但是他们并不满足STL容器的所有要求".前文提到的容器适配器stack.que ...
- UOJ34 多项式乘法(非递归版)
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- MATLAB学习笔记(六)——MATLAB数据分析与多项式计算
(一)数据处理统计 一.最大值和最小值 1.求向量的最大值和最小值 y=max(X); %返回向量X的最大值存入y,如果X中含有复数则按模最大的存入y [y,I]=max(X);%返回向量X的最大值存 ...
- 泛型编程、STL的概念、STL模板思想及其六大组件的关系,以及泛型编程(GP)、STL、面向对象编程(OOP)、C++之间的关系
2013-08-11 10:46:39 介绍STL模板的书,有两本比较经典: 一本是<Generic Programming and the STL>,中文翻译为<泛型编程与STL& ...
随机推荐
- 重新想象 Windows 8 Store Apps (67) - 后台任务: 推送通知
[源码下载] 重新想象 Windows 8 Store Apps (67) - 后台任务: 推送通知 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 后台任务 推送通 ...
- winform 属性
WinForm为客户端程序必须在.NET Framework框架上运行 一.常用属性: 布局: AutoScroll:当控件内容超出可见区域是否显示滚动条: Autosize:当控件内容有超出时是否自 ...
- 【GOF23设计模式】责任链模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_责任链模式.公文审批.供应链系统的采购审批.异常链.过滤器和拦截器调用过程 package com.test.chainO ...
- WCF服务部署到IIS7.5
下面介绍如何把WCF服务部署到IIS: 为WCF服务创建.svc文件 我们知道,每一个ASP.NET Web服务都具有一个.asmx文本文件,客户端通过访问.asmx文件实现对相应Web服务的调用.与 ...
- 一台电脑存放多个git账户的多个rsa秘钥
未命名.html div.oembedall-githubrepos{border:1px solid #DDD;border-radius:4px;list-style-type:none;marg ...
- https和http
今天登网站的时候用https登的,没登上去用http找到网站了,于是就去百度了下他俩的区别简单的画了俩图.
- Web安全开发注意事项
1.sql注入:这个很常规了,不要拼字符串以及过滤关键字都可以防住,需要注意的是,Cookie提交的参 数也是可以导致注入漏洞的.2.旁注:就是说在保证自己的程序没问题的同时,也要保证同台服务器的其他 ...
- Linux useful command
查看linux系统里面的各个目录.文件夹的大小和使用情况, 先切换到需要查看的目录,如果需要查看所有linux目录的使用情况就直接切换到系统跟目录,然后执行: du -h --max-depth=1 ...
- Android项目实战(五):TextView自适应大小
对于设置TextView的字体默认大小对于UI界面的好看程度是很重要的,小屏幕设置的文字过大或者大屏幕设置的文字过小都造成UI的不美观 现在就让我们学习自适应大小的TextView控件,即当文字长度变 ...
- Hibernate学习0.Hibernate入门
Hibernate是什么 面向java环境的对象/关系数据库映射工具. 1.开源的持久层框架. 2.ORM(Object/Relational Mapping)映射工具,建立面向对象的域模型和关系数据 ...