#include <stdio.h>
#include <malloc.h>
#define stack_init_size 100
#define stackincrement 10
#define OK 1
#define ERROR 0
#define OVERFLOW -1
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
typedef char SElemType;
typedef struct {
SElemType* base;
SElemType* top;
int stacksize;
}SqStack;
typedef int Status;
void InitStack(SqStack& S) {
S.base = (SElemType*)malloc(stack_init_size * sizeof(SElemType));
S.top = S.base;
S.stacksize = stack_init_size;
}
char GetTop(SqStack S, SElemType& e) {
if (S.top == S.base) return ERROR;
e = *(S.top - 1);
return e;
}
Status Push(SqStack& S, SElemType e) {
if (S.top - S.base >= S.stacksize) {
S.base = (SElemType*)realloc(S.base, (S.stacksize + stackincrement) * sizeof(SElemType));
if (!S.base) return OVERFLOW;
S.top = S.base + S.stacksize;
S.stacksize += stackincrement;
}
*S.top++ = e;
return OK;
}
Status Pop(SqStack& S, SElemType& e) {
if (S.top == S.base)return ERROR;
e = *--S.top;
return OK;
}
char Precede(SElemType s1, char s2) {
char f;
switch (s2)
{
case '+':if (s1 == '(' || s1 == '#')f = '<';
else f = '>'; break;
case '-': if (s1 == '#' || s1 == '(') f = '<';
else f = '>'; break;
case '*':if (s1 == '*' || s1 == '/' || s1 == ')')f = '>';
else f = '<'; break;
case '/': if (s1 == '*' || s1 == '/' || s1 == ')')f = '>';
else f = '<'; break;
case '(': if (s1 == ')')
{
printf("ERROR 1 !");
return ERROR;
}
else f = '<'; break;
case ')': if (s1 == '#')
{
printf("ERROR 2 !");
f = ERROR;
}
else
{
if (s1 == '(')
f = '=';
else
f = '>';
}break;
case '#': if (s1 == '(')
{
printf("ERROR 3 !");
f = ERROR;
}
else
{
if (s1 == '#')
f = '=';
else
f = '>';
}
break;
default: printf("ERROR 4 !");
f = ERROR;
}
return f;
}
int In(char c, SqStack OPTR) {
if (c == '+' || c == '-' || c == '*' || c == '/' || c == '(' || c == ')' || c == '#')return 1;
else return 0;
}
int Operate(char a, char theta, char b) {
switch (theta) {
case '+':return(a - 48) + (b - 48); break;
case '-':return a - b; break;
case '*':return(a - 48) * (b - 48); break;
case '/':return (a - 48) / (b - 48); break;
default:return 0;
}
}
typedef int OperandType;
OperandType EvaluateExression() {
SqStack OPTR, OPND;
InitStack(OPTR);
Push(OPTR, '#');
InitStack(OPND);
char c = getchar();
char e;
while (c != '#' || GetTop(OPTR, e) != '#') {
if (In(c, OPTR)) {
Push(OPND, c);
c = getchar();
}
else {
char x, theta, a, b;
switch (Precede(GetTop(OPTR, e), c)) {
case'<': Push(OPTR, c); c = getchar(); break;
case'=': Pop(OPTR, x); c = getchar(); break;
case'>':
Pop(OPTR, theta);
Pop(OPND, b);
Pop(OPND, a);
int value = Operate(a, theta, b);
Push(OPND, value); break;
}
}return GetTop(OPND, e);
}
}
int main()
{
int result;
printf("请输入算式:\n");
result = EvaluateExression();
printf("结果是:%d\n", result);
return 0;
}
你的测试数据是什么?
你做了哪些调试?
int In(char c) { //判断输入是不是数字,参数一个c就够????????????????????
if(48<=c && c<=57) return 1;
else return 0;
}
typedef int OperandType;
OperandType EvaluateExression() {
SqStack OPTR, OPND;
InitStack(OPTR);
Push(OPTR, '#');
InitStack(OPND);
char c = getchar();
char e;
while (c != '#' || GetTop(OPTR, e) != '#') {
if (In(c)) { //判断输入是不是数字,参数一个c就够????????????????????????
Push(OPND, c);
c = getchar();
}
else {
char x, theta, a, b;
switch (Precede(GetTop(OPTR, e), c)) {
case'<': Push(OPTR, c); c = getchar(); break;
case'=': Pop(OPTR, x); c = getchar(); break;
case'>':
Pop(OPTR, theta);
Pop(OPND, b);
Pop(OPND, a);
int value = Operate(a, theta, b);
Push(OPND, (char)(value+48)); break; //value是整型,需要+48变成字符然后再Push?????????????????????
}
}
}
return GetTop(OPND, e)-48;//写在while里面了,挪出来。记得-48因为栈数据类型是字符??????????????????????????????
}
标记的四处地方进行修改就可以啦。
下面是结果,忽略乱码汉字我没调编码,看结果。
你的栈用char类型,就导致输入的数字只能是个位数。改成double的话就可以用多位数不过数字大了容易出问题,也需要再增加一个判断是否是多位数。
您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632
非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!
速戳参与调研>>>https://t.csdnimg.cn/Kf0y
C和C++完整教程:https://blog.csdn.net/it_xiangqiang/category_10581430.html
C和C++算法完整教程:https://blog.csdn.net/it_xiangqiang/category_10768339.html