|
책예제대로 따라했는데.. 에러가나네요...
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#define MAX 80
#define SMAX 80
#define TRUE 1
#define FALSE 0
typedef struct STRING{
char s[MAX];
int mode;
} string;
typedef struct STACK {
string s[SMAX];
int sp;
} stack;
stack pstack;
void error(void) {
puts("INPUT EROOR.");
exit(1);
}
void initstack(void)
{
pstack.sp = 0;
}
void push(string n)
{
if(pstack.sp == 0)
error();
pstack.s[pstack.sp] = n;
pstack.sp++;
}
string pop( void)
{
if(pstack.sp==0)
error();
pstack.s[pstack.sp] = n;
return pstack.s[pstack.sp];
}
int isoper(int n)
{
if (n=='+' || n=='-'||n=='*'||n=='/')
return TRUE;
return FALSE;
}
void addparen(char *s)
{
int i, len;
len = strlen(s);
if(len+3 >MAX)
{
puts("string length is too small... please recompile.");
exit(3);
}
s[len]=')';
for (i=len;i>=0;i--)
s[i+1]=s[i];
s[0]='(';
s[len+2]=0;
}
void post2in(char *in,char *out)
{
int i;
int np1,np2;
string opr1,opr2;
char optmp[2];
for(i=0;in[i];i++)
{
if(!isalpha(in [i]) && !isoper(in [i]))
error();
switch(in [i])
{
case '+':
case '-':
opr2 =pop();
opr1 =pop();
optmp[0] = in[i];
optmp[1] =0;
strcat(opr1.s,optmp);
strcat(opr1.s,opr2.s);
opr1.mode=TRUE;
push(opr1);
break;
case'*':
case'/':
opr2=pop();
opr1=pop();
optmp[0] =in[i];
optmp[1] =0;
if(opr1.mode )
addparen(opr1.s);
strcat(opr1.s,optmp);
if(opr2.mode )
addparen(opr2.s);
strcat(opr1.s,opr2.s);
push(opr1);
break;
default:
opr1.s[0] = in[i];
opr1.s[1]=0;
opr1.mode = FALSE;
push(opr1);
}
}
opr1=pop();
strcpy(out,opr1.s);
}
void main(void)
{
char in[MAX],out[MAX];
int i;
initstack();
printf("Enter input:");
gets(in);
if(in[strlen(in)-1] != '#')
error();
in[strlen(in)-1]=0;
post2in(in,out);
printf("The result is : %s\n\t\t\t%s\n",in,out);
}
고수님.. 헬프미~~
즐거운하루되세요
|