大牛大牛帮一下小兄弟哈~
#include <stdio.h>#include <math.h>
#include <string.h>
#include <stdlib.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define OK 1
#define error -1
typedef struct{
char *base;
char *top;
int stacksize;
}Stack;
Stack oper;
Stack opnd;
int InitStack(Stack &s)
{//初始化空栈
s.base=(char *)malloc(STACK_INIT_SIZE*sizeof(char));
if(!s.base) exit(OVERFLOW);
s.top=s.base;
s.stacksize=STACK_INIT_SIZE;
return OK;
}
void Push(Stack & s, char x)
{//元素x进栈操作,成功返回1,否则返回0
if(s.top-s.base>=s.stacksize){
s.base=(char *)realloc(s.base,
(s.stacksize+STACKINCREMENT)*sizeof(char));
if(!s.base) exit(OVERFLOW);
s.top=s.base+s.stacksize;
s.stacksize+=STACKINCREMENT;
}
*s.top++=x;
}
char get_top(Stack & s, char & e)
{//函数的目的是得到堆栈的栈顶元素
if(s.top==s.base) return error;
e=*(s.top-1);
return e;
}
double cal(double num1 , char op , double num2 )
{//函数的目的是对不同的运算符进行计算,num1和num2是栈中的两个元素,op是运算符
double result;
switch(op)//对于不同运算符的不同的算法
{
case '+':
result = num1+num2;
break;
case '-':
result = num1-num2;
break;
case '*':
result = num1*num2;
break;
case '/':
{
result = num1/num2;
break;
}
case '^':
{
result = pow(num1,num2);
break;
}
case 'A'://这个是绝对值的
{
num1 = 0;
result = abs(num2);
break;
}
case 'S'://这个是开方的
result = sqrt(num2);
break;
case 'sin':
result = sin (num2);
break;
case 'cos':
result = cos (num2);
break;
default:
return 0;
}
return result;//想返回计算的值
}
int cal_level(char op1, char op2)
{//函数的目的是通过比较优先级,当进行下一个函数压栈运算时,能够将较低优先级的运算符压倒堆栈中
if(op1=='+'||op1=='-')//比较+,-运算符和其他运算符
{
if(op2=='*'||op2=='/'||op2=='A'||op2=='S'||op2=='^'||op2=='sin'||op2=='cos')
return -1;
else if(op2=='#'||op2=='(')
return 1;
else
return 0;
}
else if(op1=='*'||op1=='/')//比较*,/运算符和其他的关系
{
if(op2=='+'||op2=='-'||op2=='#'||op2=='(')
return 1;
else if(op2=='^'||op2=='A'||op2=='S'||op1=='sin'||op1=='cos')
return -1;
else
return 0;
}
else if(op1=='^'||op1=='A'||op1=='S'||op1=='sin'||op1=='cos')//比较这一级运算符和其他运算符的关系
{
if(op2=='+'||op2=='-'||op2=='*'||op2=='/'||op2=='#'||op2=='(')
return 1;
else
return 0;
}
else if(op1=='#')//#的运算符优先级最低
return -1;
}
//判断一个字符是否为数字
int is_digit(char ch)
{
if((ch>='0'&&ch<='9')||ch=='.')
return true;
else
return false;
}
//计算的主过程
int i;
double calcul(char unsolved[])//想传进一个字符数组,通过扫描字符数组,达到最后运算得到结果的效果
{
char e;
while (unsolved[i]!='\0')
{
//如果为数字直接压入数据栈
if(is_digit(unsolved[i]))
{
Push(opnd,unsolved[i]);
}
else //如果为运算符
{
if(unsolved[i]='(')//如果遇到左括号则直接压入运算符栈
{
Push(oper,'(');
}
if(unsolved[i]=')')//如果遇到的是右括号则不断的在两个栈之间运算,直到遇到左括号
{
while(get_top(oper,e)!='(')
{
double num1,num2;
double temp;
char op;
op=get_top(oper,e);//得到运算符
num1=get_top(opnd,e);//得到数字1
num2=get_top(opnd,e);//得到数字2
temp=cal(num1,op,num2);
Push(opnd,temp);
}
}//对于括号的解决
//比较字符的优先级,解决其他字符串的问题
if(cal_level(unsolved[i],get_top(oper,e))>0)//如果栈顶的元素优先级低则直接压入栈中
{
Push(oper,unsolved[i]);
}
while(cal_level(unsolved[i],get_top(oper,e))<0)//如果栈顶的元素优先级高则先进行计算直到栈顶的元素优先级低
{
char op;
double num1,num2;
double temp;
op=get_top(oper,e);
num1=get_top(opnd,e);
num2=get_top(opnd,e);
temp=cal(num1,op,num2);
Push(opnd,temp);
}//进行计算的过程
Push(oper,unsolved[i]);//将这个优先级高的元素压入运算符栈
}
i++;
}//已经完成了一次扫描,将所有的元素压入堆栈中了,
while(get_top(oper,e)!='#')//进行剩余计算,完成对于堆栈中剩余元素的计算
{
double temp1,temp2;
char op;
double result;
op=get_top(oper,e);
temp1=get_top(opnd,e);
temp2=get_top(opnd,e);
result=cal(temp1,op,temp2);
Push(opnd,result);//这是个问题,就是如何将计算结果从double型转化成char型
}
return get_top(opnd,e);//返回最后opnd栈中最后的结果,即计算结果
}
void main()
{
if(InitStack(oper)>0)
Push(oper,'#');
if(InitStack(opnd)>0)
Push(opnd,'0');//建立两个堆栈,一个存放运算数,一个存放运算符
char unsolved[100];
double result;
printf("请输入表达式\n");
gets(unsolved);//目的是从屏幕中得到字符串,自己的想法是利用字符数组
result=calcul(unsolved);
printf("%d",result);
}
出现的问题是程序没有错误了,但是运行不出结果,这是为什么,还有如何调试程序啊,我觉着调试也是一门功夫~
我知道这个调试很费功夫,所以加了详细的注释,还有不错的奖励,希望牛人解答一下疑惑~