📄 习题二(2).cpp
字号:
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <iostream>
using namespace std;
int balance (char *exp) //判断括号是否匹配
{
int count=0,i,len=strlen(exp);
for (i=0;i<len;i++)
{
if (*(exp+i)=='(') count++;
if (*(exp+i)==')')
{
if (count>0) count--;
else return(0);
}
}
if (!count) return(1);
else return(0);
}
int table (char op) //取优先级数
{
switch (op)
{
case '+': case '-': return(12);
case '*': case '/': case '%': return(13);
case ';': case '\0': case ')': return(1);
}
return(-1);
}
void push (float *stack,int &top,float x) //入栈
{
top++;
*(stack+top)=x;
}
float pop (float *stack,int &top) //出栈
{
float temp=*(stack+top);
top--;
return(temp);
}
float count (float val1,float val2,char op) //两数之间的运算
{
switch (op)
{
case '+': return(val1+val2);
case '-': return(val1-val2);
case '*': return(val1*val2);
case '/': return(val1/val2);
};
return(-1);
}
float operate (char *exp,int len,int &k) //求值
{
int ostop=0,nstop=-1;
float *ns,val1,val2,temp;
char *os,op,opin;
ns=(float *)malloc(len*sizeof(int)); //根据需要申请空间
os=(char *)malloc(len*sizeof(char));
*os=';';
*ns=0;
while ((*(exp+k))!='\0' || nstop>0)
{
if ((*(exp+k))=='(')
{
k++;
push(ns,nstop,operate(exp,len-k,k));
}
else
{
if ((*(exp+k))==')' && nstop==0) k++;
else
{
if (47<(*(exp+k)) && (*(exp+k))<58) //下一个运算元是数
{
temp=0;
do
{
temp=temp*10+((float)(*(exp+k))-48);
k++;
}
while (47<(*(exp+k)) && (*(exp+k))<58);
push(ns,nstop,temp);
}
else
{
opin=*(os+ostop);
op=(*(exp+k));
if (table(opin) >= table(op)) //比较两个运算符的优先级
{
val1=*(ns+nstop-1);
val2=pop(ns,nstop);
*(ns+nstop)=count(val1,val2,opin);
ostop--;
}
else
{
k++;
ostop++;
*(os+ostop)=op;
};
};
};
};
};
temp=*ns;
free(ns); //释放空间
free(os);
return(temp);
}
void main ()
{
char exp[100];
int k=0;
cout<<"输入表达式:"<<endl;;
cin>>exp;
if (balance(exp))
{
cout<<"计算结果为:"<<endl;;
cout<<exp<<"="<<operate(exp,strlen(exp),k)<<endl;
}
else cout<<"表达式输入错误,括号不匹配!"<<endl;;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -