Описание команд для стека - C (СИ)
Формулировка задачи:
Доброго времени суток
Возникла проблема с методом PUSH цикл работает не так как я хотел и не могу понять как исправить
по факту он должен пробежать по нашему массиву vm_programm_code[] и выдать на 5 10 0 0 0 но он находит первый элемент и сваливает 5 0 0 0 0
#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();
}Решение задачи: «Описание команд для стека»
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());
}
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы
- Определяем функцию main, которая является точкой входа в программу
- Передаем в функцию main два аргумента: argc и argv
- Задаем значение переменной a равным argv[1]
- Объявляем переменную i и N, которая равна длине строки a
- Инициализируем стек с помощью функции STACKinit(N)
- В цикле for перебираем каждый символ в строке a
- Если символ равен
+, то с помощью функции STACKpush() добавляем в стек результат сложения двух последних элементов стека - Если символ равен
*, то с помощью функции STACKpush() добавляем в стек результат умножения двух последних элементов стека - Если символ является числом от '0' до '9', то добавляем в стек значение 0
- Пока символ является числом от '0' до '9', то добавляем в стек значение, равное 10 умноженное на последний элемент стека, плюс значение текущего символа минус '0'
- После завершения цикла выводим на экран последний элемент стека с помощью функции printf()
- В конце программы функция STACKpop() не имеет аргументов и возвращает значение типа int