用+ - × /() 和 0 1 2 3 4 5 6 7 8 9 组成像这样的表达式:
8-6/2-3×4+(1+9)/2 然后编程求值,要求能运算任何表达式的值
一:写出编程思想或方法
二:要有流程图
三:两种方法
四:请附上运行后的图
用+ - × /() 和 0 1 2 3 4 5 6 7 8 9 组成像这样的表达式:
8-6/2-3×4+(1+9)/2 然后编程求值,要求能运算任何表达式的值
一:写出编程思想或方法
二:要有流程图
三:两种方法
四:请附上运行后的图
#include <ctype.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define N 50
struct NumStack//定义栈结构体,用来存贮运算数字
{
int top;
double array[N];
};
struct OpStack//定义栈结构体,用来存贮运算符号
{
int top;
char array[N];
};
int Cint(char mychar)//函数,数符转化成数字
{
return (mychar-48);
}
void PushNum(NumStack *numstack,double num)
{
numstack->top++;//移动指针
numstack->array[numstack->top-1]=num;//插入元素
}
void PopNum(NumStack *numstack,double *num)//输出数
{
*num=numstack->array[numstack->top-1];
numstack->top--;//移动指针
}
void PushOp(OpStack*opstack,char op)//输入运算符
{
opstack->top++;
opstack->array[opstack->top-1]=op;
}
void PopOp(OpStack*opstack,char *op)//输出运算符
{
*op=opstack->array[opstack->top-1];
opstack->top--;
}
double Calc(double a,double b,char c)//两个数的四则运算
{
double result;
switch(c){
case '+':result=a+b;break;
case '-':result=a-b;break;
case '*':result=a*b;break;
case '/':result=a/b;break;
}
return result;
}
char Priority(char y,char x)//算术优先级的判定
{
char priority='<';
switch(x){
case '+':
case '-':if(y=='('||y=='#')priority='>';break;
case '*':
case '/':if(y=='('||y=='#'||y=='-'||y=='+')priority='>';break;
case '(':priority='>';break;
case ')':if(y=='(')priority='=';break;
case '#':if(y=='#')priority='=';break;
default:priority='E';
}
return priority;
}
void Process(NumStack *numstack,OpStack *opstack,char x)//主要实现函数
{
double a,b;char c;
static double tempnum=0.00000000;
static int len=10;
static int dot=0,flags=0;
if(isdigit(x) || x=='.')
{
if(x=='.')dot=1;
else
{
if(dot==0)//前趋数部分数值还原
tempnum=tempnum*10+Cint(x);
else{tempnum=tempnum+(double)Cint(x)/len; len*=10;}//else
}//else
}//if
else
{
if(flags==0 && x!='(')
{
PushNum(numstack,tempnum);
tempnum=0.00000000;
len=10;dot=0;
}
switch(Priority(opstack->array[opstack->top-1],x))
{
case '>':PushOp(opstack,x);flags=0;break;
case '<':
PopOp(opstack,&c);
PopNum(numstack,&b);
PopNum(numstack,&a);
PushNum(numstack,Calc(a,b,c));flags=1;
Process(numstack,opstack,x);break;
case '=':PopOp(opstack,&c);flags=1;break;
default:printf("Wrong Express");exit(0);
}//switch
}//else
}//process
void main()
{
cout<<"Enter your expression and end it with #:\n"<<endl;
NumStack numstack;
OpStack opstack;
char s[N];
unsigned int i=0;
numstack.top=0;
opstack.top=0;
cin>>s;
PushOp(&opstack,'#');
for(i=0;i<strlen(s);i++)
Process(&numstack,&opstack,s[i]);
cout<<numstack.array[numstack.top-1]<<endl;
}
有了程序,管流程图就很简单了……