Постфиксная оценка в C - PullRequest
0 голосов
/ 12 ноября 2011

Я беру курс на C, и мы должны сделать программу для классической задачи оценки Postfix. Теперь, я уже выполнил эту проблему в Java, поэтому я знаю, что мы должны использовать стек для вставки чисел, а затем вставлять их, когда у нас есть оператор, я думаю, я в порядке со всеми этими вещами. Проблема, с которой я столкнулся, заключается в сканировании выражения постфикса на языке C. В Java это было проще, потому что вы могли использовать charAt и команду parseInt. Однако я не знаю ни одной подобной команды на C. Поэтому кто-нибудь может объяснить метод чтения каждого значения из строки в форме:

4 9 * 0 - =

Где равно - это сигнал конца входа.

Любая помощь будет принята с благодарностью и заранее спасибо:)

Ответы [ 3 ]

1 голос
/ 12 ноября 2011

Предположим, вы вводите в массив символов.

char input[] = "4 9 * 0 - =";

вы можете получить доступ к отдельным символам, обратившись к каждому отдельному элементу массива

if (input[4] == '*') /* deal with star */;

или вы можете использовать арифметику указателя и анализировать из другой точки на входе (не забудьте #include <stdio.h> для прототипа для `sscanf´)

if (sscanf(input + 2, "%d", &number) != 1) /* deal with error */;

Или, как предлагает Крис Латс в комментарии, использовать strtol (после правильного #include <stdlib.h>)

number = strtol(input + 2, &next, 10);
/* don't forget to check for errors! */
/* `next` now points to the character after the `long` at position 2 in the array */
0 голосов
/ 12 ноября 2011

Вы также можете узнать с помощью sscanf, сколько элементов было прочитано (счетчик хорошо прочитанных элементов данных является результатом sscanf) и какова относительная позиция (с использованием спецификатора формата %n).

, чтобы вы могли также кодировать

int pos = 0;
int endpos = 0;
int val = 0;
if (sscanf(input + pos, "%d %n", &val, &endpos) >= 1) {
  // val has been read as an integer, handle it
  stack[top++] = val;
  pos += endpos; // skip to next token in input
}

Есть еще много способов сделать это.Возможно, вы захотите прочитать о лексерах и парсерах , например, с flex и bison или antlr и т. Д..

0 голосов
/ 12 ноября 2011
Строки

C - это массивы символов: char[] или char*.Вы можете использовать цикл for для его итерации и получить каждый символ по его индексу:

for (int i = 0; i < strlen(yourString); i++)
{
    char ch = yourString[i];
    // ...
}

Также есть функция strtok(), которая может быть полезна здесь для токенизации строки:

#include <string.h>
#define NULL (void*)0

char yourString[] = "4 9 * 0 - =";
char delimiters[] = " "; // could be " +*/-=" depending on your implementation
char *token = NULL;
token = strtok(yourString, delimiters);
while(token != NULL)
{
    printf("current token is: %s\n", token);
    // do what ever you want with the token
    token = strtok(NULL, delimiters); // next token
}
...