题目:

算法设计:

计算最小值算法:
设置一个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 870764322char 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=1int 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;                              //注意,结果初始置1int 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=1pt += (str[i] - '0');}else {                                      //2.flag=0pt = (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实验题 Inversion

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

  3. DS实验题 击鼓传花

    题目: 代码1(数组实现): // // main.cpp // DS-击鼓传花 // // Created by wasdns on 16/11/9. // Copyright © 2016年 wa ...

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

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

  5. DS实验题 Floyd最短路径 Prim最小生成树

    题目: 提示: Floyd最短路径算法实现(未测试): // // main.cpp // Alg_Floyd_playgame // // Created by wasdns on 16/11/19 ...

  6. 华中农业大学python实验题

    知识汇总 博客 地址 内容 华中农业大学Python期末速成笔记 https://blog.csdn.net/m0_46521785/category_10626330.html 华中农业大学pyth ...

  7. 18.网络技术——BGP的原理+实验题(后附练习题)

    目录 1. BGP的概述 1.1 BGP消息类型及状态转换 1.2 BGP路由通告原则 1.3 BGP路径矢量特征 1.4 BGP协议特征 1.5 BGP Peer 1.6 IBGP 水平分割规则 1 ...

  8. 算法与数据结构实验题 10.23 寡人的难题

    算法与数据结构实验题 10.23 寡人的难题 ★实验任务 寡人心系天下为国为民,想要在历史中留下点痕迹,就必须要让国家强盛起来,正所谓想致富先修路,寡人觉得去修路,那些吃干饭的大臣给了寡人很多条要修的 ...

  9. 北京林业大学oj实验题search使用函数模板查找不同数据类型数组中元素是否存在

    北京林业大学oj实验题search 使用模板函数的方法来查找不同数据类型数组中的元素是否存在,若存在则返回该元素下标,若不存在则返回-1 题目: 描述 设计一个模板函数,实现在一个给定的数组中查找给定 ...

  10. 小孩的游戏 - 2021数据结构 排序和选择实验题

    小孩的游戏 - 2021数据结构 排序和选择实验题 pre 做都做了, 干脆发上来算了 : D 题目分析 算法与数据结构实验题 5.18 小孩的游戏 ★实验任务 一群小孩子在玩游戏,游戏规则是这样子, ...

最新文章

  1. vue动态发布到线上_vue在线动态切换主题色方案
  2. mysql 二进制转字符串_MySql字符转义 | 学步园
  3. 第二节:重写(new)、覆写(overwrite)、和重载(overload)
  4. 【qduoj】奇数阶幻方 (构造)
  5. segmenter.go
  6. codeforces D. Design Tutorial: Inverse the Problem
  7. leetcode53 python3 96ms 最大子序列和 python解法
  8. dio设置自定义post请求_基于dio库封装flutter项目的标准网络框架
  9. RazorPage介绍(一)
  10. 映美精两个相机同步采集求助
  11. cocos2d实现画笔功能及常用的绘制函数
  12. 《从零开始做运营》心得
  13. 【洛谷 P3191】 [HNOI2007]紧急疏散EVACUATE(二分答案,最大流)
  14. 「链节点活动年度总结」2019年区块链行业会议回顾
  15. 【招生目录】 2023年北京交通大学计算机学院博士研究生招生专业目录
  16. oCam 中文绿色版 - 免费实用的屏幕录像与截图软件 (制作视频教程/录制直播视频)
  17. epson连接计算机后无法打印,EPSON针式打印机连接正常无法打印解决
  18. 解决open()不能打开带中文的文件路径
  19. 2201: 逆置线性表(线性表)
  20. Python Selenium + PhantomJS爬取考拉海购商品数据

热门文章

  1. 20140115-URL编码与解码
  2. 学校管理系统java(数据库、源码、演讲内容、ppt等)
  3. html下载文件和上传文件(图片)(java后台(HttpServlet))打开保存路径和选择文件录取+(乱码UTF-8)+包...
  4. [Canvas]空战游戏进阶 增加己方子弹管理类
  5. is内存地址 id 地址比较 小数据池概念
  6. java 多线程 28 : 多线程组件之 Semaphore 信号量
  7. IOS7开发~Xcode5制作framework
  8. Windows环境zip版PostgreSQL数据库安装
  9. mysqldump怎么用 mysqldump没反应 mysqldump语法错误 mysqldump备份 mysql恢复 source命令 采用Navicat备份与mysqldump备份的区别...
  10. BerkeleyDB