我学数据结构时做过一个实验,跟这个很像,不过我还扩展了一下,可以计算小数、负数,得分很高哦。。。
.........stack.h...................
#define STACK_INIT_SIZE 10 /* 存储空间初始分配量 */
#define STACKINCREMENT 2 /* 存储空间分配增量 */
typedef float SElemType_f;
typedef char SElemType_ch;
typedef int Status;
#include<iostream.h>
#include<stdlib.h> /*free()头文件 */
#define OK 1
#define ERROR 0
typedef struct SqStack_f{ /* 运算数栈 */
SElemType_f *base; /* 在栈构造之前和销毁之后,base的值为NULL */
SElemType_f *top; /* 栈顶指针 */
int stacksize; /* 当前已分配的存储空间,以元素为单位 */
}SqStack_f; /* 顺序栈 */
typedef struct SqStack_ch{ /* 定义运算符栈 */
SElemType_ch *base; /* 在栈构造之前和销毁之后,base的值为NULL */
SElemType_ch *top; /* 栈顶指针 */
int stacksize; /* 当前已分配的存储空间,以元素为单位 */
}SqStack_ch; /* 顺序栈 */
Status InitStack(SqStack_f &S){ /* 构造一个运算数栈S */
S.base=new SElemType_f[STACK_INIT_SIZE];
if(!S.base)
exit(ERROR); /* 存储分配失败 */
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}
Status InitStack(SqStack_ch &S){ /* 构造一个运算符栈S */
S.base=new SElemType_ch[STACK_INIT_SIZE];
if(!S.base)
exit(ERROR); /* 存储分配失败 */
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}
float GetTop_f(SqStack_f &S){ /* 若栈不空,则用e返回运算数栈S的栈顶元素,并返回OK;否则返回ERROR */
float e;
if(S.top==S.base)
return ERROR;
e=*(S.top-1);
return e;
}
char GetTop_ch(SqStack_ch &S){ /* 若栈不空,则用e返回运算符栈S的栈顶元素,并返回OK;否则返回ERROR */
char e;
if(S.top==S.base)
return ERROR;
e=*(S.top-1);
return e;
}
void Push_f(SqStack_f &S,SElemType_f e){ /* 插入元素e为新的栈顶元素 */
if(S.top-S.base==S.stacksize) /* 栈满 */
cout<<"栈满,无法压栈!"<<endl;
*S.top++=e;
}
void Push_ch(SqStack_ch &S,SElemType_ch e){ /* 插入元素e为新的栈顶元素 */
if(S.top-S.base==S.stacksize) /* 栈满 */
cout<<"栈满,无法压栈!"<<endl;
*S.top++=e;
}
float Pop_f(SqStack_f &S,float &e){ /* 若栈不空,则删除运算数栈S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR */
if(S.top==S.base)
return ERROR;
e=*--S.top;
return e;
}
char Pop_ch(SqStack_ch &S,char &e){ /* 若栈不空,则删除运算符栈S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR */
if(S.top==S.base)
return ERROR;
e=*--S.top;
return e;
}
.........calculator.cpp.............
#include"stack.h" //自己定义的栈的头文件
#include <stdio.h> //getchar()头文件
#include<string.h>
char Precede(char t1,char t2)
{ // 判断两符号的优先关系
char f;
switch(t2){
case '+':
case '-':if(t1=='('||t1=='=')
f='<';
else
f='>';
break;
case '*':
case '/':if(t1=='('||t1=='='||t1=='+'||t1=='-')
f='<';
else
f='>';
break;
case '(':if(t1==')'){
cout<<"您的输入有误,请重新输入!"<<"\n"; //提示出错
exit(0);
}
else
f='<';
break;
case ')':if(t1=='='){
cout<<"您的输入有误,请重新输入!"<<"\n"; //提示出错
exit(0);
}
else if(t1=='(')
f='=';
else f='>';
break;
case '=':if(t1=='('){
cout<<"您的输入有误,请重新输入!"<<"\n"; //提示出错
exit(0);
}
else if(t1=='=')
f='=';
else f='>';
break;
}
return f;
}
int In(char c){ //判断c是否为运算符
int i;
switch(c){
case '+':
case '-':
case '*':
case '/':
case '(':
case ')':
case '=':return OK;
default:return ERROR;
}
return i;
}
float Operate(float a,char theta,float b){ //进行运算的函数
float c;
switch(theta){
case '+':c=a+b;break;
case '-':c=a-b;break;
case '*':c=a*b;break;
case '/':if(b==0.0){
cout<<"分母不能为零!"<<endl;exit(0);
}
c=a/b;break;
default:cout<<"错误的运算符!"<<endl;
}
return c;
}
float EvaluateExpression(){
// 算术表达式求值的算符优先算法。设OPTR和OPND分别为运算符栈和运算数栈
SqStack_f OPND;
SqStack_ch OPTR;
char c,x,theta;
char buf[16]; //将运算数存入buf[]数组
float a,b;
int i=0;
char line[100];
int h=0;
cin.getline(line,100); //读入一行字符
float j=10,k=0,z=0.0;
InitStack(OPTR); Push_ch(OPTR,'=');
InitStack(OPND);
c=line[h];
int l=strlen(line);
if(c=='-'){ //若第一个字符是'-',说明是负号,相当于 “0 -”,所以将0存入buf中
buf[0]=0;
i=1;
}
for(int m=0;m<l-1;m++){ //若等号不是出现在表达式的最末一位,提示错误
if(line[m]=='='){
cout<<"等号输入有误!"<<endl;exit(0);
}
}
if(strlen(line)==0||c=='='){ //未输入字符或只有一个“=”时,给出提示
cout<<"您没有输入表达式!"<<endl;exit(0);
}
if(line[strlen(line)-1]!='='){ //表示式不是以“=”结束时,提示错误
cout<<"未输入等号!"<<endl;exit(0);
}
while(c!='='||GetTop_ch(OPTR)!='='){ //依次读入字符,直到表达式求值完毕
if(!In(c)){ //非运算符的情况
if(c>='0'&&c<='9'){ //c为0~9之间的运算数
if(k==0){ //k为已出现的小数点的个数
buf[i]=c;
z=z*10+c-48; //小数点之前z的表达式
i++;
}
else if(k==1){ //出现小数点后
buf[i]=c;
z=z+(c-48)/j; //小数点之后每位都要缩小相应的倍数
j*=10;
i++;
}
else{
cout<<"小数点输入错误!"<<endl;exit(0); //提示错误并退出
}
}
else if(c=='.'){
k++; //每出现一个小数点,k的值加一
i++;
}
else{
cout<<"您输入了非法字符!"<<endl;exit(0); //输入了非法字符,退出
}
h++;
c=line[h];
}
else{
if(i>0){ //即buf[]内有运算数存在
Push_f(OPND,z); //将运算数压入运算数栈
z=0.0; //分别将z、i置零,j=10,准备下一次转换运算数并存储
k=0;j=10;
i=0;
}
if(line[h]=='('&&line[h+1]=='-') //某个字符是'(',且下一个字符是'-',说明是负号,相当于 “0 -”,所以将0压入运算数栈中
Push_f(OPND,0);
switch(Precede(GetTop_ch(OPTR),c)){ //比较OPTR栈顶元素和c的优先级
case '<': //c进OPTR栈
Push_ch(OPTR,c);
h++;
c=line[h];
break;
case '=': //弹出左括号
Pop_ch(OPTR,x);
h++;
c=line[h];
break;
case '>': //栈顶运算符退栈、计算,结果进OPND栈
Pop_ch(OPTR,theta);
Pop_f(OPND,b);
Pop_f(OPND,a);
Push_f(OPND,Operate(a,theta,b));
break;
}
}
}
return GetTop_f(OPND);
}
void main(){
while(1){
cout<<"***********************请输入算术表达式,并以=结束******************************"<<endl;
float n;
n=EvaluateExpression();
cout<<n<<endl;
}
}
温馨提示:内容为网友见解,仅供参考
(C++) 输入一个由数字、+、-、*、\/及括号组成的自述表达式,求其值。
typedef char SElemType_ch;typedef int Status;include<iostream.h> include<stdlib.h> \/*free()头文件 *\/ define OK 1 define ERROR 0 typedef struct SqStack_f{ \/* 运算数栈 *\/ SElemType_f *base; \/* 在栈构造之前和销毁之后,base的值为NULL *\/ SElemType_f *top; \/* 栈...
C++输入表达式,求值
法运算符“*”,且没有括号,所有参与运算的数字均为 0 到 2^31-1 之间的整数。输入数据保 证这一行只有 0~ 9、+、*这 12 种字符。输出格式:输出只有一行,包含一个整数,表示这个表达式的值。注意:当答案长度多于 4 位时,请只输出最后 4 位,前导 0 不输出。include <iostream>#includ...
用c++做一个四则运算计算器(支持加减乘除混合运算,支持括号,倒数,正负...
op.pop(); } } return dealNum(num1, num2, op1);}int main() { while (1) { \/\/循环输入,结束直接关闭即可 string my; cout << "输入算式: " << endl; getline(cin, my); dealString(my); cout << "结果为: " << cal() << endl << endl; }}———版...
C++表达求值
printf("请输入表达式%d: ", i);scanf("%s", pexpr + 101*i);char* p = pexpr + 101*i;float paramA = 0;float paramB = 0;char opertmp = ' ';char oper = ' ';while(1){ int ret = sscanf(p, "%f%c", ¶mB, &opertmp);p = strchr(p, opertmp) + 1;if ...
算数表达式求值c++
1. 只考虑 + - * \/ ( ) 这几个基本运算符,且是二元操作 2. 运算数只考虑 0-9,这10个简单的数,方便从string中取出来 3. 输入的表达式没有语法错误 【背景知识】 中缀表示法(Infix expression):操作符位于两个操作数中间,算术表达式的常规表示法。只用于二元操作符的情况,而且需要用括号和优先规则排除多义...
C或C++高手进从1到13中任选4个数,运用+,-,*,\/,()使其最后的值为24,这...
如( ( ( 1 + 2 ) + 3 ) * 4 ) = 24 和 ( ( 1 + ( 2 + 3 ) ) * 4 ) = 24去掉不必要的括号和,都能化成:(1 + 2 + 3 )*4 = 24 ,因此一般我们认为上面这两个式子是相同的。 *\/#include <iostream>#include <cstring>#include <cmath>#include <string>#include <ctime>#include...
...读入并计算一个只包含加减运算的表达式,每个输入的数据都是浮点数...
中缀转后缀表达式,然后对后缀表达式求值就可以了,这样不仅可以包含加减,还可以包含乘除括号、平方、开方等等
C语言 在一个数组或指针里有一个算式(字符串),如何对它求值?
如果当前元素是右括号")"则栈顶元素依此出栈,直至与它匹配的左括号"("出栈为止。对后缀表达式进行计算原理是这样的:对后缀表达式由左往右方向进行扫描,遇到数字则进栈,遇到运算符号则在栈里依此出栈两组数字进行计算,计算结果依然进栈,反复此操作。最后栈底部最后一个元素就是该表达式的运算结果。
如何用C++编写个程序中缀表达式变成后缀表达式,并用后缀表达式求值
cout<<"括号没有配对!"<<endl; goto start; } } if(strcmp(str,"exit")==0) break; \/\/如果输入的是exit就退出 unsigned int temp=strlen(str),k=0; \/\/把原始算式的长度存在temp里,标记k指向第一个字符 if(isdigit(str[0])) s='n'; else s='s'; \/\/判断第一个字符是数字还是符号 for...
输入一个带有括号的四则运算的算式,以#结束,输出该算式结果(用c++实现...
_tag;va_list list;va_start(list, _tag);if (tag == true)v.va = va_arg(list, double);else v.op = va_arg(list, int);}};double calc(char *s){stack<vas> temp;stack<vas> res;char c;double v1, v2;while ((c = *s) != '#'){if ((c <= '9'&&c >= '...