날마다 새롭게 또 날마다 새롭게

reverse polish 계산기 프로그램 (stack 활용) 본문

프로그래밍/C / C++

reverse polish 계산기 프로그램 (stack 활용)

아무유 2013. 3. 14. 17:20

#include <stdio.h>

#include <stdlib.h>


#define MAXOP 100    /* max size of operand or operator */

#define NUMBER '0'    /* signal that a number was found */


int getop(char[]);

void push(double);

double pop(void);


int main(void)

{

int type;

double op2;

char s[MAXOP];


while((type = getop(s)) != EOF) {

switch(type) {

case NUMBER:

push(atof(s));

break;

case '+':

push(pop() + pop());

break;

case '*':

push(pop() * pop());

break;

case '-':

op2=pop();

push(pop() - op2);

break;

case '/':

op2=pop();

if(op2==0.0)

printf("error : zero division\n");

else

push(pop() / op2);

break;

default:

printf("unknown command %s\n",s);

break;

}

}

return 0;

}


-----------------------------------------------------------

#define MAXVAL 100


int sp=0;

double val[MAXVAL];


void push(double f)

{

if(sp>=MAXVAL)

printf("error: stack full, can't push &g\n",f);

else

val[sp++]=f;

}


double pop(void)

{

if(sp>0)

return val[--sp];

else

{

printf("error: stack empty\n");

return 0.0;

}

}


-----------------------------------------------------------

#include <ctype.h>


int getch(void);

void ungetch(int);


int getop(char s[])

{

int i,c;

while((s[0]=c=getch())==' ' || c=='\t')

;

s[1]='\0';

if(!isdigit(c) && c !='.')

return c;

i=0;

if(isdigit(c))

while(isdigit(s[++i]=c=getch()))

;

if(c=='.')

while(isdigit(s[++i]=c=getch()))

;

s[i]='\0';

if(c!=EOF)

ungetch(c);

return NUMBER;

}


-----------------------------------------------------------

#define BUFSIZE 100


char buf[BUFSIZE];

int bufp = 0;


int getch(void)

{

return (bufp>0)?buf[--bufp]:getchar();

}


void ungetch(int c)

{

if(bufp>=BUFSIZE)

printf("ungetch : too many character\n");

else

buf[bufp++]=c;

}

Comments