菜鸡求助!编译环境是vs,想利用堆栈解决,表达式求和陷入死循环,谢谢大神们帮忙。感激不尽!

孙笑川 258 2020-11-10 09:45:20
#include <stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>

#define INIT 100

struct SNode
{
char* Base;
char* Top;
int Maxsize;
};

struct Node
{
double* base;
double* top;
int maxsize;
};

void CreateStack(SNode& S)
{
S.Base = (char*)malloc(INIT * sizeof(char));
if (!S.Base)
{
printf("error!\n");
}
else
{
S.Top = S.Base;
S.Maxsize = INIT;
}
}

void CreateTack(Node& S)
{
S.base = (double*)malloc(INIT * sizeof(double));
if (!S.base)
{
printf("error!\n");
}
else
{
S.top = S.base;
S.maxsize = INIT;
}
}

void PushStack(SNode& S, char X)
{
*S.Top = X;
S.Top++;
}

void PushTack(Node& S, float X)
{
*S.top = X;
S.top++;
}

char PopStack(SNode& S)
{
S.Top--;
return (*S.Top);
}

float PopTack(Node& S)
{
S.top--;
return (*S.top);
}

char GetStackTop(SNode S)
{
char e;
e = *(S.Top--);
return e;
}

float GetTackTop(Node S)
{
char e;
e = *(S.top--);
return e;
}

int Judge(char a)
{
if (a == '+' || a == '-' || a == '*' || a == '/' || a == '(' || a == ')' || a == '#')
return 1;
else
return 0;
}

double Operate(double a, char theta, double b)
{
double end = 0;
switch (theta)
{
case '+':
end = a + b;
break;
case '-':
end = a - b;
break;
case '*':
end = a * b;
break;
case '/':
end = a / b;
break;
}
return end;
}

char Compare(char a, char b)
{
char e;
switch (a)
{
case '+':
if (b == '+' || b == '-' || b == ')' || b == '#')
e = '>';
else
e = '<';
break;
case '-':
if (b == '+' || b == '-' || b == ')' || b == '#')
e = '>';
else
e = '<';
break;
case '*':
if (b == '(')
e = '<';
else
e ='>';
break;
case '/':
if (b == '(')
e = '<';
else
e = '>';
break;
case '(':
if (b == ')')
e = '=';
else
e = '<';
break;
case ')':
e = '>';
break;
case '#':
if (b == '#')
e = '<';
else if (b == ')')
e = '!';
else
e = '=';
break;
}
}

int main(int argc, char* argv[])
{
double num, x = 0, y = 0;
int i = 0, j = 0;
char TmpData[20];
char theta, c;
SNode OPTR;
Node OPND;

CreateStack(OPTR);
PushStack(OPTR, '#');
CreateTack(OPND);
c = argv[1][j];

while (c != '#' || GetStackTop(OPTR) != '#')
{
printf("2");
if (Judge(c) == 0)
{
TmpData[i] = c;
i++;
j++;
c = argv[1][j];
if (Judge(c) == 1)
{
TmpData[i] = '\0';
num = atof(TmpData);
PushTack(OPND, num);
i = 0;
}
}

else
switch (Compare(GetStackTop(OPTR), c))
{
case '<':
PushStack(OPTR, c);
j++;
c = argv[1][j];
break;
case '=':
PopStack(OPTR);
j++;
c = argv[1][j];
break;
case '>':
theta = PopStack(OPTR);
y = PopTack(OPND);
x = PopTack(OPND);
PushTack(OPND, Operate(x, theta, y));
break;
}
}
printf("%g", GetTackTop(OPND));
return 0;
}
...全文
172 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
NorZ 2020-11-13
  • 打赏
  • 举报
回复
下断点,vs调试代码这么容易的

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧