You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
96 lines
1.4 KiB
96 lines
1.4 KiB
/* RPN Reverse polish notation with stack */
|
|
|
|
#include <stdbool.h>
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <ctype.h>
|
|
|
|
|
|
|
|
#define STACK_SIZE 100
|
|
|
|
/* external variables */
|
|
int contents[STACK_SIZE];
|
|
int top = 0;
|
|
|
|
|
|
void make_empty(void);
|
|
bool is_empty(void);
|
|
bool is_full(void);
|
|
void push(int ch);
|
|
int pop(void);
|
|
void stack_overflow(void);
|
|
void stack_underflow(void);
|
|
|
|
|
|
int main(void) {
|
|
char ch = 0;
|
|
int temp;
|
|
|
|
while (ch != 'q') {
|
|
printf("Enter an RPN expression: ");
|
|
while (1) {
|
|
scanf(" %c", &ch);
|
|
if (ch == '=' || ch == 'q')
|
|
break;
|
|
// Operand found (+ and * are comutative)
|
|
if (isdigit((int)ch))
|
|
push(ch - '0');
|
|
else if (ch == '+')
|
|
push(pop() + pop());
|
|
else if (ch == '-') {
|
|
temp = pop();
|
|
push(pop() - temp);
|
|
}
|
|
else if (ch == '*')
|
|
push(pop() * pop());
|
|
else if (ch == '/'){
|
|
temp = pop();
|
|
push(pop() / temp);
|
|
}
|
|
|
|
}
|
|
printf("Value of expression: %d\n", pop());
|
|
make_empty();
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
void make_empty(void) {
|
|
top = 0;
|
|
}
|
|
|
|
bool is_empty(void) {
|
|
return top == 0;
|
|
}
|
|
|
|
bool is_full(void) {
|
|
return top == STACK_SIZE;
|
|
}
|
|
|
|
void push(int ch) {
|
|
if (is_full())
|
|
stack_overflow();
|
|
|
|
contents[top++] = ch;
|
|
}
|
|
|
|
int pop(void) {
|
|
if (is_empty())
|
|
stack_underflow();
|
|
|
|
return contents[--top];
|
|
}
|
|
|
|
void stack_overflow(void) {
|
|
printf("The expression is too complex!");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
void stack_underflow(void) {
|
|
printf("Not enough operands in expression!");
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|