在用栈求解表达式时,创建了两个栈,一个为char类型装运算符,一个为double类型装操作数,又写了一个函数把中缀表达式转换为后缀表达式,还有一个函数进行后缀表达式求解,代码如下。在vs上显示没有错误,运行后提示有异常,弄了一下午都没有解决,跪求各位大佬来帮我看看哪里错了,感谢各位大佬。
#include "pch.h"
#include <iostream>
#define Maxsize 50
using namespace std;
//创建一个char栈
typedef struct
{
char data[Maxsize]; //存放栈中的数据元素
int top; //栈顶指针
}SqStack; //顺序栈类型
void InitStack(SqStack * &s) //初始化栈
{
s = (SqStack *)malloc(sizeof(SqStack));
s->top = -1;
}
void DestoryStack(SqStack * &s) //销毁栈
{
free(s);
}
bool StackEmpty(SqStack * s) //判断栈是否为空
{
return(s->top == -1);
}
bool Push(SqStack * &s, char e) //进栈
{
if (s->top == Maxsize - 1)
return false;
s->top++;
s->data[s->top] = e;
return true;
}
bool Pop(SqStack * &s, char &e) //出栈
{
if (s->top == -1)
return false;
e = s->data[s->top];
s->top--;
return true;
}
bool GetTop(SqStack * s, char &e) //取栈顶元素
{
if (s->top == -1)
return false;
e = s->data[s->top];
return true;
}
void trans(char * exp, char postexp[]) //把中缀表达式转换为后缀表达式
{
char e;
SqStack * Optr;
InitStack(Optr);
int i = 0;
while (* exp!='\0') //扫描中缀表达式
{
switch (* exp)
{
case '(': //遇到( 进栈
Push(Optr, ')');
exp++;
break;
case ')': //遇到 )出栈
Pop(Optr, e);
while (e!='(')
{
postexp[i++] = e;
Pop(Optr, e);
}
exp++;
break;
case '+':
case '-':
while (!StackEmpty(Optr))
{
GetTop(Optr, e);
if (e != '(')
{
postexp[i++] = e;
Pop(Optr, e);
}
else
break;
}
Push(Optr, *exp);
exp++;
break;
case '*':
case '/':
while (!StackEmpty(Optr))
{
GetTop(Optr, e);
if (e == '*' || e == '/')
{
postexp[i++] = e;
Pop(Optr, e);
}
else
break;
}
Push(Optr, *exp);
exp++;
break;
default:
while (* exp>='0'&& * exp<='9')
{
postexp[i++] = * exp;
exp++;
}
postexp[i++] = '#';
}
}
while (!StackEmpty(Optr))
{
Pop(Optr, e);
postexp[i++] = e;
}
postexp[i] = '\0';
DestoryStack(Optr);
}
//创建一个double栈
typedef struct
{
double data[Maxsize]; //存放栈中的数据元素
int top; //栈顶指针
}SqStack1;
void InitStack1(SqStack1 * &s) //初始化栈
{
s = (SqStack1 *)malloc(sizeof(SqStack1));
s->top = -1;
}
void DestoryStack1(SqStack1 * &s) //销毁栈
{
free(s);
}
bool StackEmpty1(SqStack1 * s) //判断栈是否为空
{
return(s->top == -1);
}
bool Push1(SqStack1 * &s, double e) //进栈
{
if (s->top == Maxsize - 1)
return false;
s->top++;
s->data[s->top] = e;
return true;
}
bool Pop1(SqStack1 * &s, double &e) //出栈
{
if (s->top == -1)
return false;
e = s->data[s->top];
s->top--;
return true;
}
bool GetTop1(SqStack1 * s, double &e) //取栈顶元素
{
if (s->top == -1)
return false;
e = s->data[s->top];
return true;
}
double compvalue(char * postexp) //计算后缀表达式
{
double a, b, c, d, e;
SqStack1 * Opnd;
InitStack1(Opnd);
while (* postexp!='\0')
{
switch (* postexp)
{
case '+':
Pop1(Opnd, a);
Pop1(Opnd, b);
c = b + a;
Push1(Opnd, c);
break;
case '-':
Pop1(Opnd, a);
Pop1(Opnd, b);
c = b - a;
Push1(Opnd, c);
break;
case '*':
Pop1(Opnd, a);
Pop1(Opnd, b);
c = b * a;
Push1(Opnd, c);
break;
case '/':
Pop1(Opnd, a);
Pop1(Opnd, b);
if (a != 0)
{
c = b / a;
Push1(Opnd, c);
break;
}
else
{
cout << "除零错误!" << endl;
exit(0);
}
default:
d = 0;
while (* postexp>='0'&& * postexp<='9')
{
d = 10 * d + *postexp - '0';
postexp++;
}
Push1(Opnd, d);
break;
}
postexp++;
}
GetTop1(Opnd, e);
DestoryStack1(Opnd);
return e;
}
int main()
{
char exp[] = "(56-20)/(4+2)";
char postexp[Maxsize];
trans(exp, postexp);
cout << exp << endl;
cout << postexp << endl;
cout << compvalue(postexp) << endl;
}