兄弟们为什么 输入 3*(5+8)-7 或者 4+(3+4)没结果 怎么解决 急求
#include<stdio.h>#define ERROR 0
#define OK 1
//定义顺序栈
typedef struct{
char stack; // 定义存储空间为100
int top;//栈顶指针 起始值为0新增一个数栈顶 均加1
}SqStack;
//顺序栈初始化
void InitStack(SqStack *S){
S->top=0;//把栈顶指针位置为0
}
//进栈操作
int PushStack(SqStack *S,char e){
if(S->top >= 100) //进栈前 ,判断是否栈已经满了最大为100
{
printf("栈已满,进栈失败\n");
return ERROR;
}else{
S->stack=e;
S->top++;
return OK;
}
}
//出栈操作
int PopStack(SqStack *S,char *e){
if(S->top==0)
{
printf("栈已经没有元素,不能出栈");// 出栈时,栈空
return ERROR;
}else{
S->top--;
*e=S->stack;
return OK;
}
}
//取栈顶元素
int GetTop(SqStack S,char *e)
{
if(S.top<=0)
{
printf("栈已经空\n");//栈空
return ERROR;
}else{
*e=S.stack;
return OK;
}
}
int StackEmpty(SqStack S) //判断栈是否为空
{
if(S.top==0){
return OK;
} else{
return ERROR;
}
}
//中缀表达式转换成后缀表达式
void PostExpress(char str[],char exp[]){
SqStack S; //数字 符号
InitStack(&S);
char ch;
char e;//取栈顶元素比较
int i=0,j=0;
ch=str; //获取输入的数或符号
i++;//用于获得下一个
while(ch!='\0')//不为空 NULL
{
//case进栈均是 算术符号 数字直接出栈
switch(ch)
{
case '(':
PushStack(&S,ch);//进栈操作
break;
case ')' :
while(GetTop(S,&e)&&e!='(')//取栈顶元素,当栈顶不为 左括号时 接着向下取
{
PopStack(&S,&e);//弹出
exp=e;//将出栈元素非左括号 放到数组exp[]中
j++;
}
PopStack(&S,&e);//当遇到(时,将符号插入栈中;当遇到)时,将(取出栈 但不用保存在数组中
break;
case '+':
case '-':
while(!StackEmpty(S)&& GetTop(S,&e)&&(e!='('))// S不为空取S中的栈顶元素且栈顶元素不为(
{ // 因为出现(时,说明应当先对()内进行运算
PopStack(&S,&e);// 弹出栈顶元素 加减优先级低, 同时如果出现相同优先级的符号时,应当是先进去的先出来
//运算符的优先级小于栈顶运算符的优先级时,将栈顶运算符弹出并输出 没遇到左括号就先算
exp=e;//栈顶元素 放到exp[]
j++;
}
PushStack(&S,ch);//将当前运算符进栈
break;
case '*':
case '/':
while(!StackEmpty(S)&& GetTop(S,&e)&&(!e=='(')) //乘除优先级 小于左括号 还是有问题 当 x*(y-z) 相遇没结果
{ // 出栈 y z - x *
PopStack(&S,&e);// 弹出栈顶元素
exp=e;
j++;
}
PushStack(&S,ch);//将当前运算符进栈
break;
default:
while(ch>='0'&&ch<='9') // 获得数字考虑 输入的数字不止一位
{
exp=ch;//b
j++;
ch=str;//a
i++;
}
i--;
exp=' ';
j++;
}
ch=str;
i++;
}
while(!StackEmpty(S))//扫描到中缀表达式的末尾[即扫描结束],若堆栈中还有存留的运算符依次弹出并输出即可。
{
PopStack(&S,&e);
exp=e;
j++;
}
}
typedef struct {
float data;
int top;
}OpStack;
//计算后缀表达式
float ComputeExpress(char a[]){
OpStack S;
int i=0,value;
float x1,x2;
float result;//作为返回值
S.top= -1;
while(a!='\0')
{
if(a!=' ' && a>='0'&& a<='9')//数字部分
{
value=0;
while(a!=' ')//数字链接在一起 ,为一个整体
{
value=10*value+a -'0'; //????
i++;
}
S.top++;
S.data=value;
}else
{
switch(a)// 符号部分 加减乘除
{
case '+':
x1=S.data;
S.top--;
x2=S.data;
S.top--;
result=x1+x2;
S.top++;
S.data=result;//将 result 作为数组的元素
break;
case '-':
x1=S.data;
S.top--;
x2=S.data;
S.top--;
result=x2-x1;
S.top++;
S.data=result;
break;
case '*':
x1=S.data;
S.top--;
x2=S.data;
S.top--;
result=x1*x2;
S.top++;
S.data=result;
break;
case '/':
x1=S.data;
S.top--;
x2=S.data;
S.top--;
result=x2/x1; //需要 float 型 int型 小于1的部分会截去
S.top++;
S.data=result;
break;
}//switch
i++;
}
}
if(S.top!=-1){
result=S.data;
S.top--;
if(S.top==-1)
return result;
else
{
printf("表达式错误");
return ERROR;
}
}
}
int main() {
char a,b;
float f;
printf("请输入一个算术表达式:\n");
gets(a);//读取字符串
printf("中缀表达式:%s \n" ,a);
PostExpress(a,b);
printf("后缀表达式 %s \n" ,b);
f=ComputeExpress(b);
printf("计算结果: %.2lf \n",f);
return OK;
}
混点鱼币
{:10_254:} 混点鱼币
顶一下 {:10_254:} 代码有点长啊,可以混鱼币{:5_108:} 抱歉,不太懂
页:
[1]