DS实验题 最大最小
题目:
算法设计:
计算最小值算法:
设置一个flag,flag为1的时候代表遇到*号;
遇到数字时:
flag为0进栈;
flag为1的时候,从栈顶提出一个元素和当前元素运算,结果进栈
最后对栈进行加法运算,得到结果,mod。
计算最大值算法:
设置一个flag,flag为1的时候代表遇到+号;
设置一个累加器pt;
遇到数字时
1.flag为0进栈;
2.flag为1的时候,需要对之前flag的状态进行判断:
flag_pre若为1,更新累加器;
flag_pre若为0,从栈顶压出一个元素,更新累加器;
遇到乘号时
1.flag为0,continue;
2.flag为1,将flag置0,累加器结果进栈,累加器置0;
遍历字符串结束时,特判累加器是否为0,不为0进栈;
最后对栈进行乘法运算,得到结果,mod。
代码:
//
// main.cpp
// 最大最小
//
// Created by wasdns on 16/11/10.
// Copyright © 2016年 wasdns. All rights reserved.
//
#include <iostream>
#include <cstdio>
#include <string>
#include <string.h>
#include <stack>
using namespace std;
#define modn 870764322
char str[505]; //字符串
/*
计算最小值算法:
设置一个flag,flag为1的时候代表遇到*号;
遇到数字时:
flag为0进栈;
flag为1的时候,从栈顶提出一个元素和当前元素运算,结果进栈
最后对栈进行加法运算,得到结果,mod。
*/
int Nomalcal()
{
stack<int> ins;
int i, cal_result = 0;
int flag = 0;
for (i = 0; i < strlen(str); i++)
{
if (str[i] == '(' || str[i] == ')') continue; //遇到括号略过
if (str[i] >= '0' && str[i] <= '9') //遇到数字
{
int pt = str[i] - '0';
if (flag == 1) { //flag=1
int pre = ins.top();
ins.pop();
int64_t temp = pt; //为防止溢出,进行转换
temp *= pre;
temp %= modn;
pt = (int)temp;
flag = 0;
}
ins.push(pt);
}
else if (str[i] == '*') { //遇到乘号
flag = 1;
continue;
}
else continue; //遇到加号
}
while (!ins.empty()) { //计算结果
cal_result += ins.top();
cal_result %= modn;
ins.pop();
}
return cal_result;
}
/*
计算最大值算法:
设置一个flag,flag为1的时候代表遇到+号;
设置一个累加器pt;
遇到数字时
1.flag为0进栈;
2.flag为1的时候,需要对之前flag的状态进行判断:
flag_pre若为1,更新累加器;
flag_pre若为0,从栈顶压出一个元素,更新累加器;
遇到乘号时
1.flag为0,continue;
2.flag为1,将flag置0,累加器结果进栈,累加器置0;
遍历字符串结束时,特判累加器是否为0,不为0进栈;
最后对栈进行乘法运算,得到结果,mod。
*/
int maxcal()
{
stack<int> ins;
int i, cal_result = 1; //注意,结果初始置1
int flag = 0;
int pt = 0;
for (i = 0; i < strlen(str); i++)
{
if (str[i] == '(' || str[i] == ')') continue; //遇到括号
if (str[i] >= '0' && str[i] <= '9') //遇到数字
{
if (flag == 1) { //1.flag=1
pt += (str[i] - '0');
}
else { //2.flag=0
pt = (str[i] - '0');
ins.push(pt);
pt = 0;
}
continue;
}
else if (str[i] == '*') { //遇到乘号
if (flag == 1) { //flag=1时
flag = 0;
ins.push(pt);
pt = 0;
}
continue;
}
else { //遇到加号时
if (flag == 0) {
int pre = ins.top();
ins.pop();
pt += pre;
}
flag = 1;
continue;
}
}
if (pt != 0) { //特判
ins.push(pt);
}
int64_t temp = 1;
while (!ins.empty()) { //计算结果,防止溢出
temp *= (ins.top());
temp %= modn;
ins.pop();
}
cal_result = (int)temp;
return cal_result;
}
int main()
{
scanf("%s", str);
getchar();
cout << maxcal() << endl;
cout << Nomalcal() << endl;
return 0;
}
结果:
小结:
上面的代码交上去是编译错误,需要把里面的int64_t类型换成__int64
注意:防止溢出;因此在计算结果的时候(一般在乘法的地方),进行一次类型的转换,用int64存储,取mod之后再转为int。
2016/11/10
DS实验题 最大最小的更多相关文章
- DS实验题 融合软泥怪-2 Heap实现
题目和STL实现:DS实验题 融合软泥怪-1 用堆实现优先队列 引言和堆的介绍摘自:Priority Queue(Heaps)--优先队列(堆) 引言: 优先队列是一个至少能够提供插入(Insert) ...
- DS实验题 Old_Driver UnionFindSet结构 指针实现邻接表存储
题目见前文:DS实验题 Old_Driver UnionFindSet结构 这里使用邻接表存储敌人之间的关系,邻接表用指针实现: // // main.cpp // Old_Driver3 // // ...
- DS实验题 Dijkstra算法
参考:Dijkstra算法 数据结构来到了图论这一章节,网络中的路由算法基本都和图论相关.于是在拿到DS的实验题的时候,决定看下久负盛名的Dijkstra算法. Dijkstra的经典应用是开放最短路 ...
- DS实验题 sights
算法与数据结构实验题 6.3 sights ★实验任务 美丽的小风姑娘打算去旅游散心,她走进了一座山,发现这座山有 n 个景点, 由于山路难修,所以施工队只修了最少条的路,来保证 n 个景点联通,娇弱 ...
- DS实验题 order
算法与数据结构 实验题 6.4 order ★实验任务 给出一棵二叉树的中序遍历和每个节点的父节点,求这棵二叉树的先序和后序遍历. ★数据输入 输入第一行为一个正整数n表示二叉树的节点数目,节点编号从 ...
- DS实验题 Inversion
题目: 解题过程: 第一次做这题的时候,很自然的想到了冒泡和选择,我交的代码是用选择写的.基本全WA(摊手). 贴上第一次的代码: // // main.cpp // sequenceschange ...
- DS实验题 融合软泥怪-1
题目 思路 很容易想到第一种做法,用Huffman算法,从森林中找出两个值最小的节点,合并再加入森林,在这个过程中不断记录. 但是每一次需要sort一遍,将最小的两个值节点置于头两个节点,最坏情况下复 ...
- DS实验题 Order 已知父节点和中序遍历求前、后序
题目: 思路: 这题是比较典型的树的遍历问题,思路就是将中序遍历作为位置的判断依据,假设有个节点A和它的父亲Afa,那么如果A和Afa的顺序在中序遍历中是先A后Afa,则A是Afa的左儿子,否则是右儿 ...
- DS实验题 Missile
题目: 提示:并没有精度问题. 原题 NOIP2010 导弹拦截 思路 设源点为A(x1, y1)和B(x2, y2). 第一步,用结构体存节点,包括以下元素: 1.横坐标x 2.纵坐标y 3.节点和 ...
随机推荐
- 泥泞的道路(codevs 1183)
题目描述 Description CS有n个小区,并且任意小区之间都有两条单向道路(a到b,b到a)相连.因为最近下了很多暴雨,很多道路都被淹了,不同的道路泥泞程度不同.小A经过对近期天气和地形的科学 ...
- SQL 外键
先新建2个表,写入数据 -- 创建测试主表. ID 是主键. CREATE TABLE test_main ( id INT, value ), PRIMARY KEY(id) ); -- 创建测试子 ...
- hdu 4021 n数码
好题,6666 转自:http://www.cnblogs.com/kuangbin/archive/2012/08/23/2652410.html 题意:给出一个board,上面有24个位置,其中2 ...
- 动态链接库(dll)简介(转)
DLL 是 Dynamic Link Library 的缩写,译为“动态链接库”.DLL也是一个被编译过的二进制程序,可以被其他程序调用,但与 exe 不同,DLL不能独立运行,必须由其他程序调用载入 ...
- 电赛总结(二)——AD之STM32F102ZE单片机自带12位AD
直接上程序即可 #ifndef __ADC_H #define __ADC_H #include "stm32f10x.h" #include "LCD3.2.h&quo ...
- Spark Streaming中向flume拉取数据
在这里看到的解决方法 https://issues.apache.org/jira/browse/SPARK-1729 请是个人理解,有问题请大家留言. 其实本身flume是不支持像KAFKA一样的发 ...
- JVM的GC理论详解
GC的概念 GC:Garbage Collection 垃圾收集.这里所谓的垃圾指的是在系统运行过程当中所产生的一些无用的对象,这些对象占据着一定的内存空间,如果长期不被释放,可能导致OOM(堆溢出) ...
- 状压DP SGU 223 Little Kings
题目传送门 /* 题意:n*n的矩阵,放置k个king,要求king互相不能攻击,即一个king的8个方向都没有另外的king,求方案个数 状态压缩DP:dp[i][num[j]][s] 代表在第i行 ...
- API分析——Jquery UI Dialog
1.阅读API文档的一般方法? 通常地, API由三部分构成:属性.方法.事件. 属性表示参数配置,作为一个组件的微调,或者功能的开启与关闭: 方法表示组件能够发生的动作,或者组件的状态监测: 事件表 ...
- C# 新技巧(一)
概述:所有代码均来自MVC源码的阅读.实际上,也是框架开发中常用的技巧. 1.使用Empty模式处理空对象 return Enumerable.Empty<ModelValidationResu ...