Описание команд для стека - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток Возникла проблема с методом PUSH цикл работает не так как я хотел и не могу понять как исправить
#include <string.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include "stdint.h"
 
#define PUSH 0x06
#define LENGHT 5
uint32_t stack[LENGHT];
uint32_t vm_programm_code[LENGHT] = {PUSH, 5, PUSH, 10, ADD};
uint32_t sp=0; // вкршина
uint32_t i;
 
void push(void){
    if(sp >= LENGHT){
        printf("polon\n");
        return;
    }
    for ( i = 0; i < 5; i++ ) {
    if(vm_programm_code[i]=PUSH){
            stack[sp]=vm_programm_code[i+1];
                sp++;
    }
    else return;
    }
}
void vm(void){
 
push();
 
}
int main()
{
    vm();
    printf("вершина - %d\n", stack[sp-1]);
    printf("%d\n%d\n%d\n%d\n%d\n", stack[0], stack[1],stack[2],stack[3],stack[4]);
    getchar();
}
по факту он должен пробежать по нашему массиву vm_programm_code[] и выдать на 5 10 0 0 0 но он находит первый элемент и сваливает 5 0 0 0 0

Решение задачи: «Описание команд для стека»

textual
Листинг программы
#include <stdio.h>
#include <string.h>
main(int argc, char *argv[])
  { char *a = argv[1]; int i, N = strlen(a);
    STACKinit(N);
    for (i = 0; i < N; i++)
      {
        if (a[i] == '+')
          STACKpush(STACKpop()+STACKpop());
        if (a[i] == '*')
          STACKpush(STACKpop()*STACKpop());
        if ((a[i] >= '0') && (a[i] <= '9')) 
          STACKpush(0);
        while ((a[i] >= '0') && (a[i] <= '9')) 
          STACKpush(10*STACKpop() + (a[i++]-'0')); 
      }
    printf("%d \n", STACKpop());
  }

Объяснение кода листинга программы

  1. Включаем необходимые заголовочные файлы
  2. Определяем функцию main, которая является точкой входа в программу
  3. Передаем в функцию main два аргумента: argc и argv
  4. Задаем значение переменной a равным argv[1]
  5. Объявляем переменную i и N, которая равна длине строки a
  6. Инициализируем стек с помощью функции STACKinit(N)
  7. В цикле for перебираем каждый символ в строке a
  8. Если символ равен +, то с помощью функции STACKpush() добавляем в стек результат сложения двух последних элементов стека
  9. Если символ равен *, то с помощью функции STACKpush() добавляем в стек результат умножения двух последних элементов стека
  10. Если символ является числом от '0' до '9', то добавляем в стек значение 0
  11. Пока символ является числом от '0' до '9', то добавляем в стек значение, равное 10 умноженное на последний элемент стека, плюс значение текущего символа минус '0'
  12. После завершения цикла выводим на экран последний элемент стека с помощью функции printf()
  13. В конце программы функция STACKpop() не имеет аргументов и возвращает значение типа int

Оцени полезность:

5   голосов , оценка 4.2 из 5
Похожие ответы