好象不行呀
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NULL 0
#define ERROR -1
#define STACKSIZE 20
typedef struct
{
char stackname[20];
char *base;
char *top;
} Stack;
Stack OPTR, OPND;
char expr[255] = "";
char *ptr = expr;
int step = 0;
int InitStack(Stack *s, char *name)
{
s->base=(char *)malloc(STACKSIZE*sizeof(char));
if(!s->base) exit (ERROR);
strcpy(s->stackname, name);
s->top=s->base;
return 1;
}
int In(char ch)
{
return(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch==')'||ch=='#');
}
void OutputStatus(void)
{
char *s;
printf("\n%-8d", ++step);
for(s = OPTR.base; s < OPTR.top; s++)
printf("%c", *s);
printf("\t");
for(s = OPND.base; s < OPND.top; s++)
printf("%d ", *s);
printf("\t\t%c", *ptr);
}
int Push(Stack *s,char ch)
{
char *name = s->stackname;
OutputStatus();
if(strcmp(name, "OPND") == 0)
printf("\tPUSH(%s, %d)", name, ch);
else
printf("\tPUSH(%s, %c)", name, ch);
*s->top=ch;
s->top++;
return 0;
}
char Pop(Stack *s)
{
char p;
OutputStatus();
printf("\tPOP(%s)", s->stackname);
s->top--;
p=*s->top;
return (p);
}
char GetTop(Stack s)
{
char p=*(s.top-1);
return (p);
}
char Precede(char c1,char c2)
{
int i=0,j=0;
static char array[49]={ '>', '>', '<', '<', '<', '>', '>',
'>', '>', '<', '<', '<', '>', '>',
'>', '>', '>', '>', '<', '>', '>',
'>', '>', '>', '>', '<', '>', '>',
'<', '<', '<', '<', '<', '=', '!',
'>', '>', '>', '>', '!', '>', '>',
'<', '<', '<', '<', '<', '!', '='};
switch(c1)
{
case '+' : i=0;break;
case '-' : i=1;break;
case '*' : i=2;break;
case '/' : i=3;break;
case '(' : i=4;break;
case ')' : i=5;break;
case '#' : i=6;break;
}
switch(c2)
{
case '+' : j=0;break;
case '-' : j=1;break;
case '*' : j=2;break;
case '/' : j=3;break;
case '(' : j=4;break;
case ')' : j=5;break;
case '#' : j=6;break;
}
return (array[7*i+j]);
}
Operate(int a,char op,int b)
{
OutputStatus();
printf("\tOPERATE(%d, %c, %d)", a, op, b);
switch(op)
{
case '+' : return (a+b);
case '-' : return (a-b);
case '*' : return (a*b);
case '/' : return (a/b);
}
return 0;
}
int EvalExpr(void)
{
char c,theta,x,m;
int a,b;
c = *ptr++;
while(c!='#'||GetTop(OPTR)!='#')
if(!In(c))
{
m=atoi(&c);
Push(&OPND,m);
c = *ptr++;
}
else
switch(Precede(GetTop(OPTR),c))
{
case '<':
Push(&OPTR,c);
c = *ptr++;
break;
case '=':
x=Pop(&OPTR);
c = *ptr++;
break;
case '>':
theta=Pop(&OPTR);
b=Pop(&OPND); a=Pop(&OPND);
Push(&OPND,Operate(a,theta,b));
break;
}
return GetTop(OPND);
}
int func()
{
printf(" 请输入算式:\n");
char line[100];
scanf("%s",line);
int i;
for(i=0;line[i]!='\0';i++)
{
}
line[i]='#';
i++;
line[i]='\0';
strcpy(expr, line);
InitStack(&OPTR, "OPTR");
Push(&OPTR,'#');
InitStack(&OPND, "OPND");
printf("\n\nresult:%d\n", EvalExpr());
return 0;
}
int menu()
{
int o;
printf(" 任意键执行程序,退出请按0\n");
scanf("%d",&o);
return(o);
}
void main()
{
func();
int i;
i=menu();
if(i==0)
{
exit(1);
}
func();
}
程序执行第二遍时,就会有问题,显示不停刷屏,我估计的因为func 函数中的line字符串没有置空的原因