#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#define StrSize 100
typedef struct Stack
{
char data[StrSize];
int top;
}CulStack, StrStack;
typedef struct intStack
{
double data[StrSize];
int top;
}StStack;
// 将中缀表达式字符串转化为后缀表达式字符串。
// 输入字符数组,以'\0'结尾,length为字符串长度。
// 输出指向StrStack 形式的指针。
StrStack *Trans(char str[], int length) {
StrStack *sStack = (StrStack *)malloc(sizeof(StrStack));
sStack->top = 0;
StrStack opStack;
opStack.top = 0;
for (int i = 0; i < length; i++)
{
if (str[i] >= '0' && str[i] <= '9') {
sStack->data[sStack->top] = str[i];
sStack->top++;
}
if (str[i] == '.') {
sStack->data[sStack->top] = str[i];
sStack->top++;
}
if (str[i] == '+' || str[i] == '-')
{
sStack->data[sStack->top] = ' ';
sStack->top++;
while (opStack.top != 0 && opStack.data[opStack.top - 1] != '(')
{
sStack->data[sStack->top] = opStack.data[opStack.top - 1];
sStack->top++;
opStack.top--;
}
opStack.data[opStack.top] = str[i];
opStack.top++;
}
if (str[i] == '*' || str[i] == '/')
{
sStack->data[sStack->top] = ' ';
sStack->top++;
while (opStack.top != 0 && opStack.data[opStack.top - 1] != '+'&&opStack.data[opStack.top - 1] != '-'&& opStack.data[opStack.top - 1] != '(')
{
sStack->data[sStack->top] = opStack.data[opStack.top - 1];
sStack->top++;
opStack.top--;
}
opStack.data[opStack.top] = str[i];
opStack.top++;
}
if (str[i] == '(')
{
opStack.data[opStack.top] = str[i];
opStack.top++;
}
if (str[i] == ')')
{
while (opStack.top != 0 && opStack.data[opStack.top - 1] != '(')
{
sStack->data[sStack->top] = opStack.data[opStack.top - 1];
sStack->top++;
opStack.top--;
}
opStack.top--;
}
}
while (opStack.top != 0)
{
sStack->data[sStack->top] = opStack.data[opStack.top - 1];
sStack->top++;
opStack.top--;
}
sStack->data[sStack->top] = '\0';
return sStack;
}
// 将后缀表达式通过栈的结构算出结果。
// 输入c形式字符串,以'\0'结尾。
// 输出int型结果。
double Calcul(StrStack *opStack) {
StStack *sStack = (StStack *)malloc(sizeof(StStack));
sStack->top = -1;
double result = 0, num = 0;
int numLen = 0;
for (int i = 0; i < opStack->top; i++) {
// 将字符组合成double型数据
if (opStack->data[i] >= '0' && opStack->data[i] <= '9') {
num = 0;
for (numLen = 0; opStack->data[i + numLen] >= '0' && opStack->data[i + numLen] <= '9'; numLen++)
;
for (int k = 0; k < numLen; k++)
num = num + (opStack->data[i + k] - '0') * pow(10, numLen - k - 1);
/*
//删除此字段,20170420
//将字符组合成数字,此段将整数部分反向组合
//解决:先判断位数,再组合
num = 0;
for (numLen = 0; opStack->data[i + numLen] >= '0' && opStack->data[i + numLen] <= '9'; numLen++)
num = num + (opStack->data[i + numLen] - '0') * pow(10, numLen);
*/
if (opStack->data[i + numLen] == '.') {
for (int j = -1; opStack->data[i + numLen + 1] >= '0' && opStack->data[i + numLen + 1] <= '9'; numLen++, j--)
num = num + (opStack->data[i + numLen + 1] - '0') * pow(10.0, j);
sStack->data[++sStack->top] = num;
i = i + numLen;
continue;
}
sStack->data[++sStack->top] = num;
i = i + numLen - 1;
}
// 跳过空格
else if (opStack->data[i] == ' ')
continue;
// 运算
else {
switch (opStack->data[i])
{
case '+':
result = sStack->data[sStack->top - 1] + sStack->data[sStack->top];
sStack->top -= 2;
sStack->data[++sStack->top] = result;
break;
case '-':
result = sStack->data[sStack->top - 1] - sStack->data[sStack->top];
sStack->top -= 2;
sStack->data[++sStack->top] = result;
break;
case '*':
result = sStack->data[sStack->top - 1] * sStack->data[sStack->top];
sStack->top -= 2;
sStack->data[++sStack->top] = result;
break;
case '/':
result = sStack->data[sStack->top - 1] / sStack->data[sStack->top];
sStack->top -= 2;
sStack->data[++sStack->top] = result;
break;
default:
break;
}
}
}
free(opStack);
return result;
}
int main() {
char in[100];
printf("请输入表达式:");
scanf("%s", in);
StrStack *str = Trans(in, strlen(in));
printf("后缀表达式为:%s\n", str->data);
printf("原式的答案为:%lf\n", Calcul(str));
return 0;
}
表达式计算,输出后缀表达式,栈实现
原创
©著作权归作者所有:来自51CTO博客作者DUT_LYH的原创作品,请联系作者获取转载授权,否则将追究法律责任

提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
cron表达式详细讲解
cron表达式简介
cron表达式 -
中缀表达式转为后缀表达式 ---- 栈
题目:给一个中缀表达式(即标准形式的表达式),打印该表达式的后缀表达式。中缀表达式最大的不同就
C++ 栈 表达式 操作数 #include -
后缀表达式计算
sole application.//#include "stdafx.h"#includeiostream>#includestack>#incl
string c system 算法 java -
中缀表达式转后缀表达式与计算
中缀表达式转后缀表达式与计算1.创建两个栈,一个存储数字和后缀表达式s1括号。具体实现如下://将中缀表达式转换为后缀表达式 public static Li
数据结构 栈 List Stack 后缀表达式 -
中缀表达式转逆波兰表达式(后缀表达式)
编写程序,将任意一个合法的中缀表达式转换成逆波兰
运算符 中缀表达式 优先级 -
计算器:中缀表达式转后缀表达式
这几天想写一个Android的计算器,所以先写好中缀表达式到后缀表达式的计算。例如:中缀表达式(8+9*10)-4/2+3我们可以进行如下
中缀表达式 后缀表达式 出栈 运算符 操作符