Язык Си в примерах/Калькулятор выражений в обратной польской нотации: различия между версиями

Содержимое удалено Содержимое добавлено
Нет описания правки
Нет описания правки
Строка 44:
// sp = индекс ячейки, куда будет push-иться очередное число
int sp =0; // (sp-1) = индекс ячейки, являющейся вершиной стека
while ( !feof(stdin) ) {
int c = getchar();
int x;
switch (c) {
case ' ':
case '\n':
Строка 67:
break;
default:
ungetc (c, stdin); // вернуть символ обратно в поток
if (scanf("%d", &x) != 1) {
fprintf(stderr, "Can't read integer\n");
return -1;
Строка 114:
int stack[1000];
int pop(void) {
if (sp > 0) {
return stack[--sp];
} else {
Строка 130:
int main() {
int i;
while (!feof(stdin)) {
int c = getchar();
int x;
Строка 143:
default:
ungetc(c, stdin);
if (scanf("%d", &x) != 1) {
fprintf(stderr, "Can't read integer\n");
return -1;
Строка 154:
RESULT:
i = 0;
while (! !empty() ){
printf("Stack[%d] = %d\n", i, s.pop());
i++;
Строка 191:
*/
stack_t* stack_new(int initial_size) {
stack_t *stack = (stack_t*) malloc (sizeof(stack_t));
stack->data_size = initial_size;
if(stack->data_size <= 0) stack->data_size = 100;
Строка 210:
*/
void stack_push(stack_t *stack, int a) {
if (stack->last == stack->data_size) {
stack->data_size = (stack->data_size * 3 + 1) / 2;
stack->data = (int*)realloc(stack->data, stack->data_size * sizeof(int));
Строка 221:
*/
int stack_pop(stack_t *stack, int *a) {
if (stack->last > 0) {
*a = data[--stack->last];
return 1;
Строка 233:
===Задания===
 
# Реализуйте RPN-калькулятор, используя эту реализацию стека. Выделите вычисление RPN-выражения в отдельную функцию.
# Постройте систему тестов и проверьте, что Вашваш калькулятор успешно проходит все тесты и «защищён от дурака» (как дурака-пользователя программы, так и дурака-программиста, использующего ваш стек и калькулятор).