利用栈实现逆波兰表达式求值
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计题目十九:利用栈实现逆波兰表达式求值
基本要求:
1.输入表达式,并对表达式的括号式匹配问题进行判。
2.输出逆波兰式的值。
#include
#include
#include
#include
#include
#include
#define N 200
void trans(char str[],char exp[])//这是求解的关键,将算术表达式转换成逆波兰表达式。
{
struct
{
char data[N];
int top; //栈顶指针
}op; //在这设立一个字符栈,用于存放字符!
char ch;
int i=0, t=0;
op.top = -1;
ch = str[i];
i++;
while(ch != '\0')//判断字符是数字的进入后缀表达式数组exp[N],字符进入字符栈中
{
switch(ch)
{
case '(': op.top++;
op.data[op.top] = ch;
break;
case ')':
while(op.data[op.top] != '(')
{
exp[t] = op.data[op.top];
op.top--;
t++;
}
op.top--;
break;
case '+':
case '-':
while(op.top!=-1 && op.data[op.top]!='(')
{
exp[t] = op.data[op.top];
t++;
op.top--;
}
op.top++;
op.data[op.top] = ch;
break;
case '*':
while (op.data[op.top]!='(' && op.data[op.top]=='/')
{
exp[t] = op.data[op.top];
op.top--;
t++;
}
op.top++;
op.data[op.top] = ch;
break;
case '/':
while (op.data[op.top]!='(' && op.data[op.top]=='*')
{
exp[t] = op.data[op.top];
op.top--;
t++;
}
op.top++;
op.data[op.top] = ch;
break;
case ' ': break;
default:
while((ch>='0' && ch<='9') || (ch == '.'))
{
exp[t] = ch; t++;
ch = str[i]; i++;
}
i--;
exp[t] = '#';
t++;
}
ch = str[i];
i++;
}
while(op.top!=-1 && op.data[op.top]!='(')
{
exp[t] = op.data[op.top];
t++;
op.top--;
}
exp[t] = '\0';
}
double compvalue(char exp[]) //对后缀表达式进行求解,计算。{
struct
{
double data[N];
int top; //栈顶指针
}st; //设立一个数值栈,将数组中的数值推入栈中
char ch;
int t = 0;
double d, n,sum;
st.top = -1;
ch = exp[t];
t++;
while(ch !='\0')//对数值和字符进行运算
{
switch(ch)
{
case '+': st.data[st.top-1] = st.data[st.top-1] + st.data[st.top];
st.top--;break;
case '-': st.data[st.top-1] = st.data[st.top-1] - st.data[st.top];
st.top--;break;
case '*': st.data[st.top-1] = st.data[st.top-1]*st.data[st.top];
st.top--;break;
case '/':
if (st.data[st.top] != 0)
st.data[st.top-1] = st.data[st.top-1]/st.data[st.top];
else
{
printf("\n\t除零错误\n");
exit(0);
}