107 lines
2.5 KiB
C
107 lines
2.5 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
typedef int datatype;
|
|
|
|
void push(datatype v); // используется для вычислений
|
|
|
|
datatype pop(void);
|
|
|
|
int isEmpty(void); // определяет пустой ли стек st
|
|
void operate(char c); // вычисляем два верхних значения на стеке st
|
|
|
|
#define MAX_STACK_SIZE 255
|
|
|
|
datatype st[MAX_STACK_SIZE]; // массив - стек
|
|
int pst=0; // заполненность стека
|
|
|
|
void push(datatype v) // используется для вычислений
|
|
{
|
|
st[pst++]=v;
|
|
}
|
|
datatype pop()
|
|
{
|
|
if(pst<=0) {
|
|
fprintf(stderr, "Error. Stack underflow");
|
|
return 1;
|
|
} else if(pst>MAX_STACK_SIZE) {
|
|
fprintf(stderr, "Error. Stack overflow");
|
|
return 1;
|
|
}
|
|
return st[--pst];
|
|
}
|
|
|
|
int isEmpty() // определяет пустой ли стек st
|
|
{
|
|
return (pst<=0);
|
|
}
|
|
|
|
void operate(char c) // вычисляем два верхних значения на стеке st
|
|
{
|
|
datatype arg1=pop(),arg2=pop();
|
|
switch(c)
|
|
{
|
|
case '+':
|
|
push(arg1+arg2);
|
|
break;
|
|
case '-':
|
|
push(arg2-arg1);
|
|
break;
|
|
case '*':
|
|
push(arg1*arg2);
|
|
break;
|
|
case '/':
|
|
push(arg2/arg1);
|
|
break;
|
|
}
|
|
}
|
|
_Bool isDigit(char c) // проверяем является ли символ цифрой
|
|
{
|
|
return ((c>='0')&&(c<='9'));
|
|
}
|
|
|
|
_Bool isOperator(char c) {
|
|
return c=='+' || c=='-' || c=='*' || c=='/';
|
|
}
|
|
|
|
// main.c
|
|
//#include <stdio.h>
|
|
//#include "stack.h"
|
|
|
|
int main(void)
|
|
{
|
|
char c;
|
|
printf("Input inverse string: ");
|
|
|
|
char str[1000];
|
|
int len=0;// 1 2 + 4 * 3 + // 3 5 + 10 * 17 2 * -
|
|
//answer = 15 // answer = 46
|
|
//~ scanf("%[^\n]",str);
|
|
//~ len=strlen(str);
|
|
while((c=getchar())!='\n')
|
|
str[len++]=c;
|
|
str[len]=0;
|
|
//~ printf("str=%slen=%d\n",str,len);
|
|
for(int i=0;i<len;i++)
|
|
{
|
|
if(isDigit(str[i]))
|
|
{
|
|
datatype number;//strtof( const char * string, char ** endptr, int basis );
|
|
for(number=0;isDigit(str[i]);i++)
|
|
number=number*10+str[i]-'0';
|
|
//~ printf("%d \n",number);
|
|
push(number);
|
|
}
|
|
else
|
|
{
|
|
if(i>=len)
|
|
break;
|
|
if(isOperator(str[i]))
|
|
operate(str[i]);
|
|
}
|
|
}
|
|
printf("answer = %d\n",pop());
|
|
return 0;
|
|
}
|