说明:本代码旨在帮助实现遇到困难的低年级学生或非计算机相关专业学生借鉴,是借鉴,不是抄袭,我强烈建议你自己先实现一遍。这是我一个非计算机专业的同学和我一起完成的。这是我通过栈实现的,代码质量简洁性效率性还是很好的,逻辑清晰(相对初学者,我认为),bug基本改完了,至少我找到的都改了。如有更好的方式欢迎指出。
补充:如果正是大一的你,你想实现功能更强大的计算器,比如用QT实现不仅仅四则运算的,可以在大二参考我另外的一篇博客。
当然等你学数值分析之后,如果想把里面的算法怎么解决方程实现一次,也可以参考我的另外的博客。
// bds_qz.cpp: 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#define n 50
#pragma warning(disable:4996)
typedef struct
{
char a[n];
int size;//表示栈中含有的元素数量
} stack;
char pop(stack *p)
{
if (p->size == 0)
printf("空栈");
else
{
--(p->size);
return p->a[p->size];
}
}
char top(stack *p)
{
if (p->size == 0)
return '/0';//抛出/0字符代表空
else
{
return p->a[p->size - 1];
}
}
int empty(stack *p)
{
return p->size == 0;
}
void push(stack *p, char b)
{
p->a[p->size] = b;
++p->size;
}
int compare(char a)//用于比较优先级
{
int i;
switch (a)
{
case '+':
i = 1;
break;
case '-':
i = 1;
break;
case '*':
i = 2;
break;
case '/':
i = 2;
break;
default:
i = 0;
break;
}
return i;
}
void merge(float *a, float b, char c)//用于将两数字合并,注意前面的数字传地址
{
if (c == '-')
{
(*a) -= b;
}
else if (c == '+')
{
(*a) += b;
}
else if (c == '*')
{
(*a) *= b;
}
else
(*a) /= b;
}
void qiuzhi(char *bds)
{
int i = 0;
stack *ysf = (stack*)malloc(sizeof(stack));//为表达式开辟一个stack
ysf->size = 0;
float num[50];//用于求值的数组
int numpos = 0;//用于求值的数组位置//ps因为num这个栈用的操作非常的少,而stack没有泛化,所以没有采用栈
printf("后缀表达式为:");
while (bds[i] != '=')
{
if (bds[i] == '\0')
{
printf("表达式应该有=");
return;
}
if (bds[i] <= '9'&&bds[i] >= '0')//为数字的情况,转换为1个数,如234
{
num[++numpos] = 0;
while (bds[i] <= '9'&&bds[i] >= '0')
{
num[numpos] *= 10;
num[numpos] += (bds[i] - '0');
++i;
}
if (bds[i] == '.')
{
double f_car = 0.1;//定义基数
++i;
while (bds[i] <= '9'&&bds[i] >= '0')
{
num[numpos] += ((bds[i] - '0')*f_car);
f_car *= 0.1;
++i;
}
}//计算小数点
}
else
{
if (empty(ysf))
push(ysf, bds[i]);
else
{
if (bds[i] == '(')
push(ysf, bds[i]);
else if (bds[i] == ')')
{
while (top(ysf) != '(')
{
merge(&num[numpos - 1], num[numpos], top(ysf));
printf("%c", pop(ysf));
--numpos;
}
pop(ysf);//弹出右括号
}
else
{
while (compare(bds[i])<=compare(top(ysf)))
{
merge(&num[numpos - 1], num[numpos], top(ysf));
printf("%c", pop(ysf));
--numpos;
}
push(ysf, bds[i]);
}
}
++i;
}
}
while (!empty(ysf))
{
merge(&num[numpos - 1], num[numpos], top(ysf));
printf("%c", pop(ysf));
--numpos;
}
printf("\n运算结果为:%.2f\n", num[1]);
}
int main()
{
stack *p;
char bds[50];
scanf("%s", bds);
qiuzhi(bds);
return 0;
}
示例: