题目:

算法设计:

计算最小值算法:

设置一个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实验题 最大最小的更多相关文章

  1. DS实验题 融合软泥怪-2 Heap实现

    题目和STL实现:DS实验题 融合软泥怪-1 用堆实现优先队列 引言和堆的介绍摘自:Priority Queue(Heaps)--优先队列(堆) 引言: 优先队列是一个至少能够提供插入(Insert) ...

  2. DS实验题 Old_Driver UnionFindSet结构 指针实现邻接表存储

    题目见前文:DS实验题 Old_Driver UnionFindSet结构 这里使用邻接表存储敌人之间的关系,邻接表用指针实现: // // main.cpp // Old_Driver3 // // ...

  3. DS实验题 Dijkstra算法

    参考:Dijkstra算法 数据结构来到了图论这一章节,网络中的路由算法基本都和图论相关.于是在拿到DS的实验题的时候,决定看下久负盛名的Dijkstra算法. Dijkstra的经典应用是开放最短路 ...

  4. DS实验题 sights

    算法与数据结构实验题 6.3 sights ★实验任务 美丽的小风姑娘打算去旅游散心,她走进了一座山,发现这座山有 n 个景点, 由于山路难修,所以施工队只修了最少条的路,来保证 n 个景点联通,娇弱 ...

  5. DS实验题 order

    算法与数据结构 实验题 6.4 order ★实验任务 给出一棵二叉树的中序遍历和每个节点的父节点,求这棵二叉树的先序和后序遍历. ★数据输入 输入第一行为一个正整数n表示二叉树的节点数目,节点编号从 ...

  6. DS实验题 Inversion

    题目: 解题过程: 第一次做这题的时候,很自然的想到了冒泡和选择,我交的代码是用选择写的.基本全WA(摊手). 贴上第一次的代码: // // main.cpp // sequenceschange ...

  7. DS实验题 融合软泥怪-1

    题目 思路 很容易想到第一种做法,用Huffman算法,从森林中找出两个值最小的节点,合并再加入森林,在这个过程中不断记录. 但是每一次需要sort一遍,将最小的两个值节点置于头两个节点,最坏情况下复 ...

  8. DS实验题 Order 已知父节点和中序遍历求前、后序

    题目: 思路: 这题是比较典型的树的遍历问题,思路就是将中序遍历作为位置的判断依据,假设有个节点A和它的父亲Afa,那么如果A和Afa的顺序在中序遍历中是先A后Afa,则A是Afa的左儿子,否则是右儿 ...

  9. DS实验题 Missile

    题目: 提示:并没有精度问题. 原题 NOIP2010 导弹拦截 思路 设源点为A(x1, y1)和B(x2, y2). 第一步,用结构体存节点,包括以下元素: 1.横坐标x 2.纵坐标y 3.节点和 ...

随机推荐

  1. 菜菜买气球(codevs 2851)

    题目描述 Description 六一儿童节到了,菜菜爸爸带着菜菜来到了游乐园,菜菜可高兴坏了.这不,菜菜看到了一排卖气球的,便吵着闹着要买气球. 不过这些卖气球的也奇怪,他们都站成了一排,而且每个人 ...

  2. oracle 10g 学习之.NET使用Oracle数据库(14)

    因为使用System.Data.OracleClient会提示过时,推荐使用oracle自己提供的.net类库Oracle.DataAccess.Client 在oracle C:\oracle\pr ...

  3. [原]ASP.NET 数据库访问通用工具

    在工作中,有很多项目已上线后,很多项目的数据库服务器都不会对外开放的,外网想直接访问客户数据库服务器时,可能会出现困难. 这时就需要一个可以查询,更新数据库操作的页面了: 本来用sql语句直接操作数据 ...

  4. struts2的标签中得到JSP脚本的变量值

    转自:http://www.cnblogs.com/modou/articles/1299024.html 大家先来看一段代码: <% int i=1; %> <s:property ...

  5. 使用SQL Server维护计划实现数据库定时自动备份

    在SQL Server中出于数据安全的考虑,所以需要定期的备份数据库.而备份数据库一般又是在凌晨时间基本没有数据库操作的时候进行,所以我们不可能要求管理员每天守到晚上1点去备份数据库.要实现数据库的定 ...

  6. Hadoop开发中,如何开启、关闭控制台打印调试信息

    第一种方法: 修改$HADOOP_CONF_DIR/log4j.properties文件 hadoop.root.logger=ALL,console 第二种方法 开启:export HADOOP_R ...

  7. HTML-web storage

    cookie:是一个在服务区和客户端间来回传送文本值的内置机制: 大小受限:一般4KB: 只要涉及cookie,它就会自动在服务器和浏览器之间传送:  //会存在安全问题:多消耗网络宽带: 操作:de ...

  8. Xamarin开发Anroid应用介绍

    第1章  Xamarin开发Anroid应用介绍 如今智能手机已经盛行了好几年,而针对这些智能手机的软件开发也变得异常火热.但是在Android平台下只能使用Java开发,iOS平台下也只能使用Obj ...

  9. Machine Schedule

    Machine Schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  10. 【wikioi】1403 新三国争霸(dp+kruskal)

    http://wikioi.com/problem/1403/ 一开始的确感觉和bzoj1003很像,不同的是这里还要求联通,求最小的边. 我们可以想到用最小生成树(为嘛我自己想不到呢..) 我们可以 ...