Код: Выделить всё
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define STACK_LENGTH 80
#define BUFFER_LENGTH 81
/* Переменные для хранения стека */
int Stack_Count;
int Stack_Array[STACK_LENGTH];
/* Функции самого стека */
void stack_push(int n) /* Добавить элемент в стек */
{
if( Stack_Count < STACK_LENGTH )
Stack_Array[Stack_Count++] = n;
}
int stack_pop() /* Извлечь элемент из стека */
{
if(Stack_Count != 0)
return Stack_Array[--Stack_Count];
else
return 0;
}
void stack_init() /* Начальная инициализация стека*/
{
Stack_Count = 0;
}
/* Функции стекового калькулятора */
void stack_add() /* Сложение */
{
stack_push( stack_pop() + stack_pop() );
}
void stack_sub() /* Вычетание */
{
stack_push( stack_pop() - stack_pop() );
}
void stack_mul() /* Умножение */
{
stack_push( stack_pop() * stack_pop() );
}
void stack_div() /* Деление */
{
stack_push( stack_pop() / stack_pop() );
}
void stack_print() /* Печать последнего элемента */
{
printf( "Last: %d\n", stack_pop() );
}
/* Функции работы с пользователем */
void parse(char *str) /* Функция распознавания строки */
{
char *st;
for(st = strtok(str, " "); st != NULL; st = strtok(NULL, " "))
{
switch(*st)
{
case '+':
stack_add();
break;
case '-':
stack_sub();
break;
case '*':
stack_mul();
break;
case '/':
stack_div();
break;
case '.':
stack_print();
break;
default:
stack_push(atoi(st));
break;
}
}
}
/* Главная функция */
int main()
{
char buf[BUFFER_LENGTH];
stack_init(); // Инициализируем стек
printf( "Введите строки для вычисления:\n" );
printf( "(для выхода введите строку, начинающуюся с символа '#')\n" );
for( scanf("%s", buf); (strlen(buf) > 0) && (buf[0] != '#'); scanf("%s", buf) ) // Запрашиваем строки и выполняем их
parse(buf);
return 0;
}