#include <stdio.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
#define MaxSize 100
typedef struct{
double data[MaxSize];
int top;
}SqStack;
void InitStack(SqStack &S){
S.top=-1;//top是栈顶元素位置
}
bool Push(SqStack &S,double x) //压栈操作即进栈
{
if(S.top==MaxSize-1) return false;//栈满了
S.data[++S.top]=x;
return true;
}
bool Pop(SqStack &S,double &x) //出栈操作
{
if(S.top==-1)
return false;//栈为空
x=S.data[S.top--];
return true;
}
void reverse(char str[],int start,int end){
char temp;
while(start<end){
temp=str[start];
str[start]=str[end];
str[end]=temp;
start++;
end--;
}
}
int Calc(char str[],int len) //计算表达式
{
SqStack S;
InitStack(S);
int i=len-1;
double right,left,temp;
while(i>=0){
if ((str[i] >= '0' && str[i] <= '9') || str[i] == '.'){
char num[10] = {};
int j = 0;
while ((str[i] >= '0' && str[i] <= '9') || str[i] == '.') { //如果是99,12.5这种数字
num[j++] = str[i];//j=0,1,2,,,
if ((str[i - 1] >= '0' && str[i - 1] <= '9') || str[i - 1] == '.') i--;
else break;
}
if(strlen(num)>1){
reverse(num,0,strlen(num)-1);
}
temp = atof(num);
Push(S, temp);
i--;
}
else if(str[i]=='+' ||str[i]=='-' ||str[i]=='*' ||str[i]=='/') {
switch(str[i]){
case '+':
Pop(S,left);
Pop(S,right);
left+=right;
Push(S,left);
break;
case '-':
Pop(S,left);
Pop(S,right);
left-=right;
Push(S,left);
break;
case '*':
Pop(S,left);
Pop(S,right);
left*=right;
Push(S,left);
break;
case '/':
Pop(S,left);
Pop(S,right);
if (right != 0){
left/=right;
Push(S,left);
break;
}
else
{
printf("分母不能为0!\n");
exit(0);
}
}
i--;
}
else{
i--;
}
}
double ret;
Pop(S,ret);
return ret;
}
int main(int argc, char *argv[])
{
char str[]="- + 4 * 1 - 5 2 / 6 3";
int len = strlen(str);
printf("%s = %d\n",str,Calc(str,len));
return 0;
}
应为用到了引用,所以虽然很多这是个cpp文件,如果想用c可以将引用改为指针。