菜鸡求助!编译环境是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;
}
...全文
202 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
NorZ 2020-11-13
  • 打赏
  • 举报
回复
下断点,vs调试代码这么容易的
代码转载自:https://pan.quark.cn/s/eefcd5647328 在信息技术行业中,BIOS(基本输入输出系统)扮演着计算机硬件与操作系统之间的重要桥梁角色,其主要职责包括对硬件进行初始化和检测,以及负责启动操作系统的加载流程。联Y430P作为一款广受用户青睐的便携式计算设备,而“联Y430P-刷BIOS V3.66”特指将这款设备的BIOS版本升级至V3.66的具体操作。此类操作有时是不可或缺的,因为BIOS的升级能够修正已知的系统缺陷,优化硬件的互操作性,或者提升整体运行效能。 我们必须明确为何需要进行BIOS的刷新操作。联Y430P设备可能存在某些功能上的约束,比如网卡白名单机制,这种机制会限制用户更换非原装硬件设备,例如无线网络适配器。网卡白名单是BIOS内嵌的一种安全防护措施,它仅允许经过认证的特定型号网卡在系统中正常工作,以此来保障系统的兼容性与稳定性。然而,这种安全特性同时也对用户自主进行硬件升级造成了限制。通过安装新版本的BIOS,我们可以移除这类限制条件,使系统能够识别并兼容更多种类的网卡设备,具体而言,在更新至BIOS V3.66版本后,用户可以自由更换网卡和显卡,而不会触发设备未获授权的警示信息。 在执行BIOS刷新操作之前,必须保持高度的审慎态度,因为不恰当的BIOS更新可能导致设备无法正常启动。以下是进行BIOS刷新的标准流程: 1. **保存当前BIOS状态**:在执行更新之前,强烈建议对现有的BIOS进行备份,以便在更新后出现问题时能够迅速恢复至初始状态。 2. **获取精确版本的BIOS更新包**:需从官方渠道或可信赖的第三方资源中下载与联Y430P设备相匹配的BIOS V3.66升级文件。 3. *...

5,529

社区成员

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

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