Помощь - Поиск - Пользователи - Календарь
Полная версия: постфиксный калькулятор
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ада и другие языки
nblazhko
Нужно написать постфиксный калькулятор с использованием стека

вот что я нашел,но здесь вводится последовательно,а нужно чтоб вводилось в 1 строчку т.е. 2 3+=

#include <stdio.h>
#include <stdlib.h>

#define MAX 100

int *p;
int *tos;
int *bos;

void push(int i);
int pop(void);

int main(void)
{
int a, b;
char s[80];

p = (int *) malloc(MAX*sizeof(int));
if(!p) {
printf("Ошибка при выделении памяти\n");
exit(1);
}
tos = p;
bos = p + MAX-1;


printf("Нажмите 'q' для выхода\n");

do {
printf(": ");
gets(s);
switch(*s) {
case '+':
a = pop();
b = pop();
printf("%d\n", a+b);
push(a+b);
break;
case '-':
a = pop();
b = pop();
printf("%d\n", b-a);
push(b-a);
break;
case '*':
a = pop();
b = pop();
printf("%d\n", b*a);
push(b*a);
break;
case '/':
a = pop();
b = pop();
if(a==0) {
printf("Деление на 0.\n");
break;
}
printf("%d\n", b/a);
push(b/a);
break;
case '.':
a = pop();
push(a);
printf("Текущее значение на вершине стека: %d\n", a);
break;
default:
push(atoi(s));
}
} while(*s != 'q');

return 0;
}

/* Занесение элемента в стек. */
void push(int i)
{
if(p > bos) {
printf("Стек полон\n");
return;
}
*p = i;
p++;
}


int pop(void)
{
p--;
if(p < tos) {
printf("Стек пуст\n");
return 0;
}
return *p;
}

volvo
Например, так:
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>

#define MAX 100
int *p;
int *tos;
int *bos;

void push(int i);
int pop(void);

int main(void)
{
int a, b, i;
char s[80], st[10], *ps;
p = (int *) malloc(MAX*sizeof(int));
if(!p) {
printf("Ошибка при выделении памяти\n");
exit(1);
}
tos = p;
bos = p + MAX-1;
printf("-> ");
gets(s);
ps = s;

do {
switch(*ps) {
case '+':
a = pop();
b = pop();
printf("%d\n", a+b);
push(a+b);
ps++;
break;
case '-':
a = pop();
b = pop();
printf("%d\n", b-a);
push(b-a);
ps++;
break;
case '*':
a = pop();
b = pop();
printf("%d\n", b*a);
push(b*a);
ps++;
break;
case '/':
a = pop();
b = pop();
if(a==0) {
printf("Деление на 0.\n"); ps++;
break;
}
printf("%d\n", b/a);
push(b/a);
ps++;
break;
case '.':
a = pop();
push(a);
printf("Текущее значение на вершине стека: %d\n", a);
ps++;
break;

default:
i = 0;
for(; isdigit(*ps); ps++) {
st[i++] = *ps;
}
st[ i ] = '\0';
push(atoi(st));
}
while(*ps == ' ') ps++;
} while(*ps);
getchar();
return 0;
}
/* Занесение элемента в стек. */
void push(int i)
{
if(p > bos) {
printf("Стек полон\n");
return;
}
*p = i;
p++;
}
int pop(void)
{
p--;
if(p < tos) {
printf("Стек пуст\n");
return 0;
}
return *p;
}

Контрольный пример: 2 3 + 4 * 5 +. Знак "равно" вводить не надо, конец строки это вычисление окончательного результата. Использование точки можешь выбросить, в НЕдиалоговом режиме оно не надо...
nblazhko
Благодарю=) good.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.