• Status: Solved
• Priority: Medium
• Security: Public
• Views: 187

# how to make a program by using stack

how to make c program like a culculator....using stack to solve it.
eg output:
12*(15-6) + 388=496
0
1 Solution

Commented:
Strange some question. 2 different users. Are you both in the same school. Sorry not homework will be done in EE. Post what you have done already and we will help you the solve your problems.
0

Commented:
it's quite easy.first change the expression into a prefix expression (or postfix ).you may refer to some goos data structures book for this purpose.once you have done so it is very easy to calculate it.(try reading data structures using pascal by tenebaum and augustein or data structures by tremblay sorenson)
you may try even knuth
0

Commented:
Pretty cheap points for source code.
#include "stdio.h"

#define Err(n)       printf(errm[n-1])
#define Guard(n)     if(sp<n-1){ Err(1); break; }

char errm[3][40] = { "Insufficient stack elements\n",
"Stack full\n",
"Invalid input\n"
};

char base = 'd',buf[160];
int cp=0;

main()

{       long stk[10],mem,sp;
int i;
char c,num[20];

sp=-1;
mem=0;

do
{       c=getnext();
switch(c)
{       case 'x':
base='x';
if(sp>=0)
{       printf("\n");
show(stk[sp]);
}
break;
case 'd':
base='d';
if(sp>=0)
{       printf("\n");
show(stk[sp]);
}
break;
case '+':
Guard(2);
stk[sp-1]+=stk[sp];
--sp;
printf("\n");
show(stk[sp]);
break;
case '-':
Guard(2);
stk[sp-1]-=stk[sp];
--sp;
printf("\n");
show(stk[sp]);
break;
case '*':
Guard(2);
stk[sp-1]*=stk[sp];
--sp;
printf("\n");
show(stk[sp]);
break;
case '/':
Guard(2);
stk[sp-1]/=stk[sp];
--sp;
printf("\n");
show(stk[sp]);
break;
case 't':
printf("\n");
if(sp>=0)show(stk[sp]);
break;
case 'a':
printf("\n");
for(i=sp; i>=0; --i)show(stk[i]);
break;
case 'p':
Guard(1);
--sp;
break;
case 's':
mem=stk[sp];
break;
case 'r':
stk[sp]=mem;
break;
case 'm':
printf("\n");
show(mem);
break;
case 'q':
case '\n':
case '\r':
case ' ':
break;
default:
if('0'<=c && c<='9')
{       if(sp<9)
{       backup();
getnum(num);
++sp;
if(base=='d')sscanf(num,"%ld",stk+sp);
else sscanf(num,"%lx",stk+sp);
}
else Err(2);
}
else Err(3);
}
} while(c!='q');
}

show(a)
long a;

{       if(base=='d')printf("%ld\n",a);
else printf("%lx\n",a);
return;
}

getnext()

{       if(buf[cp]=='\0')getline();
return(buf[cp++]);
}

backup()

{       if(cp>0)--cp;
return;
}

getnum(num)
char *num;

{       int dp;

dp=0;
while( ('0'<=buf[cp] && buf[cp]<='9') || (base=='x' && 'a'<=buf[cp] && buf[cp]<='f') )num[dp++]=buf[cp++];
num[dp]='\0';
return;
}

getline()

{       char *sp,*dp;

scanf("%s",buf);
dp=buf;
for(sp=buf; *sp!='\0'; ++sp)
{       if(*sp!=8)*dp++=*sp;
else dp=dp>buf?dp-1:dp;
}
*dp='\0';
cp=0;
return;
}
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.