• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 391
  • Last Modified:

Problem in stack(data structure in C)

How to write a program using stack (in C language)which functions almost like a calculator. the program will receive inputs like for example : 12 * (15 - 6) + 388  
The program will calculate +, -, *, /, (), operations.  
The priority operations are :

   1st. ( )
   2nd. *, /
   3rd. +, -

The program will print the operation for example like The question above :

15 - 6
12 * 9
108 + 388
= 496
0
tagheuer
Asked:
tagheuer
1 Solution
 
rbrCommented:
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
 
emmonsCommented:
Some code from imladris...
#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

Featured Post

Free tool for managing users' photos in Office 365

Easily upload multiple users’ photos to Office 365. Manage them with an intuitive GUI and use handy built-in cropping and resizing options. Link photos with users based on Azure AD attributes. Free tool!

Tackle projects and never again get stuck behind a technical roadblock.
Join Now