Exercise 4-4. Add the commands to print the top element of the stack without popping, to duplicate it, and to swap the top two elements. Add a command to clear the stack.
/* Exercise 4-4. Add the commands to print the top element of the stack without popping, to duplicate it, and to swap the top two elements. Add a command to clear the stack. */#include<stdio.h>#include<stdlib.h> /* for atof() */#define MAXOP 100 /* max size of operand or operator */#define NUMBER '0' /* signal that a number was found */intgetop(char[]);voidpush(double);doublepop(void);doubletop(void);voidduplicate_top(void);voidswap_top2(void);voidclear(void);voidview_stack(void);/* reverse Polish calculator */intmain(){inttype;doubleop2;chars[MAXOP];while((type=getop(s))!=EOF){switch(type){caseNUMBER: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)push(pop()/op2);elseprintf("error: zero divisor\n");break;case'%':op2=pop();if(op2!=0.0)push((int)pop()%(int)op2);elseprintf("error: zero divisor\n");break;case'\n':printf("\t%.8g\n",pop());break;case't':printf("Top element in a stack = %g\n",top());break;case'v':view_stack();break;case's':swap_top2();break;case'd':duplicate_top();break;case'c':clear();break;default:printf("error: unknown command %s\n",s);break;}}return0;}#define MAXVAL 100 /* maximum depth of val stack */intsp=0;/* next free stack position */doubleval[MAXVAL];/* value stack *//* push: push f onto value stack */voidpush(doublef){if(sp<MAXVAL)val[sp++]=f;elseprintf("error: stack full, can't push %g\n",f);}/* pop: pop and return top value from stack */doublepop(void){if(sp>0)returnval[--sp];else{printf("error: stack empty\n");return0.0;}}/* print the top element of the stack without popping */doubletop(void){if(sp>0)returnval[sp-1];else{printf("error: stack empty\n");return0.0;}}/* duplicate the top element of the stack */voidduplicate_top(void){if(sp>0){val[sp]=val[sp-1];sp++;}elseprintf("error: stack empty\n");}/* swap the top two elements of the stack*/voidswap_top2(void){doubletmp;if(sp>1){tmp=val[sp-2];val[sp-2]=val[sp-1];val[sp-1]=tmp;}elseprintf("error: stack contains less than 2 elements\n");}/* clear the stack*/voidclear(void){sp=(sp>0)?0:sp;}/* print stack elements */voidview_stack(void){intvp=sp;while(--vp>=0)printf("%g\n",val[vp]);}#include<ctype.h>intgetch(void);voidungetch(int);/* getop: get next character or numeric operand */intgetop(chars[]){inti,c;while((s[0]=c=getch())==' '||c=='\t');s[1]='\0';if(!isdigit(c)&&c!='.')returnc;/* not a number */i=0;if(isdigit(c))/* collect integer part */while(isdigit(s[++i]=c=getch()));if(c=='.')/* collect fraction part */while(isdigit(s[++i]=c=getch()));s[i]='\0';if(c!=EOF)ungetch(c);returnNUMBER;}#define BUFSIZE 100charbuf[BUFSIZE];/* buffer for ungetch */intbufp=0;/* next free position in buf */intgetch(void)/* get a (possibly pushed-back) character */{return(bufp>0)?buf[--bufp]:getchar();}voidungetch(intc)/* push character back on input */{if(bufp>=BUFSIZE)printf("ungetch: too many characters\n");elsebuf[bufp++]=c;}