支持+-*/()int 型数据的计算机c++实现

  1 #include <iostream>
  2 #include<sstream>
  3 using namespace std;
  4 template<typename T>
  5 class stack
  6 {
  7     T p[40];
  8     int toop;
  9 public:
 10     stack() { toop = -1; }
 11     void push(T t) { toop++; p[toop] = t; }
 12     T top() { return p[toop]; }
 13     bool empty() { if (toop == -1)return true; return false; }
 14     void pop() { toop--; }
 15 };
 16 class caculator
 17 {
 18     string s;//原波兰式的容器
 19     stack<char>op;
 20     stack<float>num;
 21     stringstream ss;//用于转换的流
 22     stringstream sb;//插入逆波兰式的流
 23     string str;//存放数字的容器,每次更新
 24     string strs;//存放逆波兰式的容器
 25     float x, y;
 26 public:
 27     caculator(char *p) { s = p; }
 28     float trans(const char *p);
 29     float antipoland();
 30     void show() { cout << strs; }
 31     void readnum();
 32     void caucEveTime();
 33     void shownum() { while (!num.empty()) { cout << num.top() << endl; num.pop(); } }
 34     void showop() { while (!op.empty()) { cout << op.top() << endl; op.pop(); } }
 35 };
 36 float caculator::trans(const char *p)//底层const,对象为常量
 37 {
 38     float n;
 39     n = *p - ‘\0‘ - 48;//确保转化成int后数值不变
 40     int i = strlen(p);
 41     while (--i)
 42     {
 43         *p++;
 44         n = n * 10 + (*p - ‘\0‘ - 48);
 45     }
 46     return n;
 47 }
 48 void  caculator::readnum()
 49 {
 50     str = ss.str();
 51     if (!str.empty())//str中存放数字串
 52     {
 53         ss.str("");//清空流
 54         num.push(trans(str.c_str()));
 55     }
 56 }
 57 void caculator::caucEveTime()//由符号栈弹出符号决定调用
 58 {
 59     y = num.top();
 60     num.pop();
 61     x = num.top();
 62     num.pop();
 63     switch (op.top())
 64     {
 65     case‘+‘:num.push(x + y); break;
 66     case‘-‘:num.push(x - y); break;
 67     case‘*‘:num.push(x*y); break;
 68     case‘/‘:num.push(x / y); break;
 69     default:break;
 70     }
 71 }
 72 float caculator::antipoland()
 73 {
 74     for (int i = 0; i < s.size(); i++)
 75     switch (s[i])
 76     {
 77     case ‘(‘:op.push(s[i]);readnum(); break;
 78     case ‘+‘:
 79     case ‘-‘:
 80         readnum();
 81     if (op.top() == ‘(‘)
 82     op.push(s[i]);
 83     else if(op.empty())
 84         op.push(s[i]);
 85     else
 86     {
 87     while (!op.empty())
 88     {
 89         if (op.top() != ‘(‘&&op.top() != ‘)‘)
 90         {
 91             sb << op.top();
 92             caucEveTime();
 93         }
 94         op.pop();
 95     }
 96     op.push(s[i]);
 97     }
 98     break;
 99     case ‘)‘:
100         readnum();
101     while (op.top() != ‘(‘)
102     {
103        sb << op.top();
104        caucEveTime();
105        op.pop();
106     }op.pop(); break;
107     case ‘*‘:
108     case‘/‘:
109         readnum();
110     while (op.top() == ‘*‘ || op.top() == ‘/‘)
111     {
112        sb << op.top();
113        caucEveTime();
114        op.pop();
115     }op.push(s[i]); break;
116     default:
117     sb << s[i];
118     ss <<s[i];
119     break;
120     }
121     str = ss.str();
122     num.push(trans(str.c_str()));
123     while (!op.empty())
124     {
125         if (op.top() != ‘(‘&&op.top() != ‘)‘)
126         {
127             sb<< op.top();
128             caucEveTime();
129         }
130          op.pop();
131     }
132
133     strs = sb.str();
134     return num.top();
135 }
136 void main()
137 {
138     char ch[40];
139     char *p=ch;
140     cin >> p;
141     caculator a(p);
142     //a.antipoland();//两次重复调用改变数字栈中的数字!
143     // a.show();
144      cout <<"="<<a.antipoland()<<endl;
145     // cout << endl;
146     //a.shownum();
147     //a.showop();
148 } 
时间: 2024-08-23 11:43:28

支持+-*/()int 型数据的计算机c++实现的相关文章

C++读写TXT文件中的string或者int型数据以及string流的用法

对文件的读写操作是我们在做项目时经常用到的,在网上看了很多博客,结合自身的项目经验总结了一下,因此写了这篇博客,有些地方可能直接从别的博客中复制过来,但是都会注明出处. 一.文件的输入输出 fstream提供了三个类,用来实现c++对文件的操作.(文件的创建.读.写). ifstream -- 从已有的文件读入 ofstream -- 向文件写内容 fstream - 打开文件供读写 文件打开模式: ios::in             只读 ios::out            只写 io

求int型数据在内存中存储时1的个数

1.求int型数据在内存中存储时1的个数 输入一个int型数据,计算出该int型数据在内存中存储时1的个数. 我们非常easy想到例如以下方法: #include <iostream> using namespace std; int main() { int n,cnt=0; cin>>n; while(n) { if(n%2==1) cnt++; n=n/2; } cout<<cnt<<endl; return 0; } 在对代码进行測试时输入负数无法得

C语言int型数据范围

在32位及以上操作系统上,int型数据的十进制表示范围是:-231 到   231-1.原因:因为int是带符号类型,所以最高位为符号位,于是最大表示的正数的原码(正数的原码和补码相同):01111111 11111111 11111111 11111111,也就是2的31次方减1.再来看最小值,-2的31次方的原码表示为10000000 00000000 00000000 00000000,此时最高位的数字既代表符号(1代表是负数,0代表是正数),也代表数值.求它的补码(除符号位外按位取反,最

求int型数组和最大子数组 续

之前的博文里已经实现过该程序的构思.编译.运行,本次就不再重复与之相雷同的内容. 题目:与别人借组,借助求int型数组最大和子数组的问题,考虑大数溢出和int取值范围的问题 要求: 调试程序  当子数组所含元素值超过int型数组取值范围时,会出现什么情况? 实现: 在接触到这个问题之前,肯定的说,我从来没有考虑过这个问题,不是自己不知道int型数值的取值范围,而是自己根本没有注意过这个问题,也没有想过数的取值会超过这个范围.知道这个“问题”后我做了下面的事情: a.和同学借组,查阅相关资料,了解

(一)求 int 型数据在内存中存储时 1 的个数

题目:求 int 型数据在内存中存储时 1 的个数 描述:输入一个 int 型数据,计算出该 int 型数据在内存中存储时 1 的个数 运行时间限制: 10 sec 内存限制:128 MByte 输入:输入一个整数(int 类型) 输出:这个数转换成2进制后,输出 1 的个数 1 #include <stdio.h> 2 3 int GetCount(int num) 4 { 5 /* 功能实现 */ 6 int ret = 0; 7 8 while (num) 9 { 10 num &

华为笔试——C++的int型数字位排序

题目:int型数字位排序 题目介绍:输入int 型整数,按照从右至左的顺序,返回不含重复数字的新整数. 例: 输入: 99824270 输出: 072489 分析:乍一看很简单,但是很容易忽略int 型包含负整数的这一情况,还有为了应对多组测试数据需要在输入中加入while 循环. 代码: 1 #include <iostream> 2 #include <string> 3 using namespace std; 4 int main() 5 { 6 string str; 7

java如何把char型数据转换成int型数据(转)

一字符串,String=“2324234535”:把第i个数取出来时是char型的:char temp=String.charAt(i)如何把char型转换成int型?我需要求个尾数之和,如:123的各位数之和为6. 每个字符取出来,得到char型的1,2,3,4,5:但是求和得到的结果是ASCII码值 处理办法: (1)把char转成字符串, Integer.parseInt(""+'1')或String a = "12345";int d = Integer.p

判断一个int型数字是否是自守数

自守数 如果某个数的平方的末尾几位数等于这个数,那么就称这个数为自守数. 显然,5和6是一位自守数(5x5=25 6x6=36),25x25=625 76x76=5776,所以25和76是两位自守数. 详细描述: 接口说明 原型: Public static boolean isAutoMorphicNum( int num) 输入参数: num 需要判断的数 输出参数(指针指向的内存区域保证有效): 无 返回值: true 是自守数 false 不是自守数 涉及知识点: JAVA语言基础:数字

memset为int型数组初始化问题

头文件:#include <string.h>memset() 函数用来将指定内存的前n个字节设置为特定的值,其原型为:    void * memset( void * ptr, int value, size_t num );参数说明: ptr 为要操作的内存的指针. value 为要设置的值.你既可以向 value 传递 int 类型的值,也可以传递 char 类型的值,int 和 char 可以根据 ASCII 码相互转换. num 为 ptr 的前 num 个字节,size_t 就是