33,311
社区成员
发帖
与我相关
我的任务
分享
//stack.h {
#include<string.h>
#include<malloc.h>
#include<stdio.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int Boolean;
#define STACK_INIT_SIZE 10
#define STACK_INCREMENT 2
typedef int Selemtype;
struct Sqstack
{
Selemtype *base;
Selemtype *top;
int stacksize;
};
void InitStack(Sqstack &s)
{
s.base = (Selemtype*)malloc(STACK_INIT_SIZE*sizeof(Selemtype));
if(!s.base){
exit(OVERFLOW);
}
s.top=s.base;
s.stacksize=STACK_INIT_SIZE;
}//顺序栈初始化
void DestroyStack(Sqstack &s)
{
free(s.base);
s.top = s.base = NULL;
s.stacksize=0;
} //销毁栈
void ClearStack(Sqstack &s)
{
s.top=s.base;
} //重置栈
int StackEmpty(Sqstack &s)
{
if(s.top==s.base)
return OK;
else
return ERROR;
} //判断栈空
int StackLenth(Sqstack &s){
return s.top-s.base;
} //求栈长
int Getelem(Sqstack &s,Selemtype &e){
if(s.top>s.base){
e=*(s.top-1);
return OK;
}
else
return ERROR;
} //取栈顶元素
void Push(Sqstack &s,Selemtype e){
if(s.top-s.base==s.stacksize)
{
s.base=(Selemtype*)realloc(s.base,(s.stacksize+STACK_INCREMENT)*sizeof(Selemtype));
if(s.base)
exit(OVERFLOW);
s.top=s.base+s.stacksize;
s.stacksize+=STACK_INCREMENT;
}
*(s.top)++ = e;
}//压栈
int Pop(Sqstack &s,Selemtype &e)
{
if(s.top==s.base){
return ERROR;
}
e = * --s.top;
return OK;
} //出栈
void StackTraverse(Sqstack &s,void(*visit)(Selemtype)){
Selemtype *p = s.base;
while(s.top>p)
visit(*p++);
printf("\n");
}
char Precede(Selemtype t1,Selemtype t2)
{
char f;
switch(t2) {
case '+':
case '-':
if(t1=='('||t1=='\n')
f='<';
else
f='>';
break;
case '*':
case '/':
if(t1=='*'||t1=='/'||t1==')')
f='>';
else
f='<';
break;
case '(':
if(t1==')') {
printf("括号不匹配");
exit(OVERFLOW);
}
else
f='<';
break;
case ')':
switch(t1) {
case '(':
f= '=';
break;
case '\n':
printf("缺乏左括号");
exit(OVERFLOW);
default:
f='>';
}
break;
case '\n':
switch(t1) {
case '\n':
f= '=';
break;
case '(':
printf("缺乏右括号\n");
exit(OVERFLOW);
default:
f='>';
}
}
return f;
}//符号优先级
int In(Selemtype c)
{
switch(c)
{
case '+':
case '-':
case '*':
case '/':
case '(':
case ')':
case '\n':return TRUE;
default:return FALSE;
}
}//判断符号
int Operate(Selemtype a,Selemtype th,Selemtype b)
{
switch(th)
{
case '+':
return a+b;
case '-':
return a-b;
case '*':
return a*b;
}
return a/b;
}
//stack.h }
//main.cpp {
//#include"stack.h"
int Evaluate() {
Sqstack OPTR,OPND;
int a,b,d,x;
char c;
InitStack(OPTR);
InitStack(OPND);
Push(OPTR,'\n');
c=getchar();
Getelem(OPTR,x);
while(c!='\n'||x!='\n') {
if(In(c))
switch(Precede(x,c)) {
case'<':
Push(OPTR,c);
c=getchar();
break;
case'=':
Pop(OPTR,x);
c=getchar();
break;
case'>':
Pop(OPTR,x);
Pop(OPND,b);
Pop(OPND,a);
Push(OPND,Operate(a,x,b));
}
else if(c>='0'&&c<='9') {
d=0;
while(c>='0'&&c<='9') {
d=d*10+c-'0';
c=getchar();
}
Push(OPND,d);
} else {
printf("出现非法字符!\n");
exit(OVERFLOW);
}
Getelem(OPTR,x);
}
Pop(OPND,x);
if(!StackEmpty(OPND)) {
printf("表达式不正确!");
exit(OVERFLOW);
}
return x;
}
int main(){
printf("请输入算数表达式,负数要用(0-正数)表示\n");
printf("%d\n",Evaluate());
return 0;
}
//main.cpp }
请在此版本上在IDE中调试吧。
等你依赖IDE的变量值显示功能调试不得要领后,再参考下面的话
★不要依赖调试器输出复杂数据结构!而要将复杂数据结构的整个内容在处理它的每一步使用一小段代码按自己很容易理解的格式输出,非常有助于调试!或者可以说是“基础设施”
和我上面的回帖。