菜鸡求助!编译环境是vs,想利用堆栈解决,表达式求和陷入死循环,谢谢大神们帮忙。感激不尽!
#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;
}
相关推荐
鸡啄米 VS2010环境下进行VC++编程
网页版的鸡啄米基于VS2010的VC++全套教程 VC新手入门的最佳教材
VS2019 C++程序卡死诊断:从死循环到死锁的实战调试指南
在C++程序开发中,程序运行卡死是常见的调试难题,通常表现为界面无响应或CPU占用率异常。其背后原理往往涉及线程管理、资源调度或同步机制失效,例如线程陷入死循环、发生死锁或存在内存泄漏。掌握高效的诊断技术对于保障软件稳定性和性能至关重要。通过使用集成开发环境(IDE)内置的性能剖析工具和调试器,开发者可以深入分析程序运行时状态,精准定位问题根源。这种工程实践方法广泛应用于桌面应用、后台服务等需要高可靠性的场景。本文聚焦于Visual Studio 2019环境,详细解读如何利用其并行堆栈窗口和性能探查器等核
C语言在x86上使用堆栈的方式
参数压栈顺序 C语言参数压栈顺序是从右到左,这是为了支持可变长参数的函数。 以cprintf()函数为例。 在我做过的jos操作系统中,该函数原型是 int cprintf(const char *format, ...); 这就是一个可变长参数形式,参数的具体个数由format中的占位符%决定。 如果压栈顺序是从左到右,看一看会是什么情况? format最先入栈,然后把其他参数入栈。 那么fo...
用C++程序实现复杂表达式的计算问题
在很多数据结构的经典教材中提到了求解复杂表达式的问题,核心是堆栈的设计和算符优先级的设计。我用BCB6实现了这个问题,简单的谈一下我的思路。 Step-1:设计堆栈结构,双向链表。 Struct LinkingStack { String data; LinkingStack *front; //前指针 LingkingSt
vs2010下利用dmp和pdb文件分析异常行号
此代码用与分析代码中异常位置的实例,可以生成pdb文件、dmp文件,二者通过Windbg可以得到源码中异常行号。已测试,没有问题。


模式及实现
