#include <iostream>
#include <conio.h>
struct stek
{
int d;
struct stek *next; //указатель на следующий элемент списка (стека)
};
void push(stek **netx, int d); //функция будет помещать элемент в стек
// next – указатель на вершину стека
int pop(stek **netx); //функция будет извлекать элемент их стека
//вершина которого - next
void push(stek **next, int d)
{ stek *pv = new stek; //объявляем новую динамическую переменную типа stek
pv->d=d; //записываем значение, которое помещается в стек
pv->next=*next; //связываем новый элемент стека с предыдущим
*next=pv; //новый элемент стека становится его вершиной
}
int pop(stek **next)
{ int temp=(*next)->d; //извлекаем в переменную temp значение в вершине стека
stek *pv=*next; //запоминаем указатель на вершину стека, чтобы затем
//освободить выделенную под него память
*next=(*next)->next; //вершиной становится предшествующий top элемент
delete pv; //освобождаем память, тем самым удалили вершину
return temp; //возвращаем значение, которое было в вершине
}
int main()
{
char v[25]="5 9 8 + 4 6 * * 7 + * ";
stek *next=0;
int a,b;
int i=0;
while (v[i]!='\0')
{
if (v[i] == '+') push(&next,pop(&next)+pop(&next));
if (v[i] == '*') push(&next,pop(&next)*pop(&next));
if (v[i] == '-') push(&next,-(pop(&next)-pop(&next)));
if ((v[i]>='0') && (v[i]<='9')) push(&next,0);
while ((v[i]>='0')&&(v[i]<='9')) push(&next,10*pop(&next)+(v[i++]-'0'));
i++;
}
printf("\n %i \n",pop(&next));
return 0;
}
У тебя стек построен таким образом, что физически не может хранить вещественые числа. Переведи его на работу с float, и будет тебе счастье...
А насчет обратного порядка - не страшно, есть операция "запятая". Кстати, если у тебя С++ (а у тебя-таки С++, потому как new и подключен iostream) - то можно избавиться от указателя на указатель, заменив его ссылкой:
#include <iostream>
#include <conio.h>
struct stek
{
int d;
struct stek *next; // указатель на следующий элемент списка (стека)
};
void push(stek* &next, int d); // функция будет помещать элемент в стек
// next – указатель на вершину стека
int pop(stek* &next); // функция будет извлекать элемент их стека
// вершина которого - next
void push(stek* &next, int d)
{
stek *pv = new stek; // объявляем новую динамическую переменную типа stek
pv->d = d; // записываем значение, которое помещается в стек
pv->next = next; // связываем новый элемент стека с предыдущим
next = pv; // новый элемент стека становится его вершиной
}
int pop(stek* &next)
{
int temp = next->d; // извлекаем в переменную temp значение в вершине стека
stek *pv = next; // запоминаем указатель на вершину стека, чтобы затем
// освободить выделенную под него память
next = next->next; // вершиной становится предшествующий top элемент
delete pv; // освобождаем память, тем самым удалили вершину
return temp; // возвращаем значение, которое было в вершине
}
int main()
{
// char v[25]="5 9 8 + 4 6 * * 7 + * ";
char v[]="1 2 -";
stek *next=0;
int a, b;
for(int i = 0; v[i] != '\0'; i++)
{
switch(v[i])
{
case '+': push(next, pop(next) + pop(next)); break;
case '-': push(next, ((a = pop(next)), (b = pop(next)), b - a)); break;
case '*': push(next, pop(next) * pop(next)); break;
case '/': push(next, ((a = pop(next)), (b = pop(next)), b / a)); break;
default:
if(isdigit(v[i])) push(next, 0);
while(isdigit(v[i]))
push(next, 10*pop(next) + (v[i++]-'0'));
}
}
printf("\n %i \n",pop(next));
return 0;
}
Я переделал это все в класс и теперь надо добавлять поддержку функций,это лучше делать через функцию класса или продолжить в самом конструкторе воротить?
#include <iostream>
#include <conio.h>
class PostAr
{
private:
struct stek
{
int d;
struct stek *next; // указатель на следующий элемент списка (стека)
};
public:
PostAr(char *input);
struct stek *push (struct stek* &next, int p); // функция будет помещать элемент в стек
// next – указатель на вершину стека
int pop(struct stek* &next); // функция будет извлекать элемент их стека
// вершина которого - next
};
PostAr::stek *PostAr::push(struct stek* &next, int p)
{
stek *pv = new stek; // объявляем новую динамическую переменную типа stek
pv->next = next; // связываем новый элемент стека с предыдущим
pv->d = p; // записываем значение, которое помещается в стек
return pv; // новый элемент стека становится его вершиной
}
int PostAr::pop(struct stek* &next)
{
int temp = next->d; // извлекаем в переменную temp значение в вершине стека
stek *pv = next; // запоминаем указатель на вершину стека, чтобы затем
// освободить выделенную под него память
next = next->next; // вершиной становится предшествующий top элемент
delete pv; // освобождаем память, тем самым удалили вершину
return temp; // возвращаем значение, которое было в вершине
}
PostAr::PostAr(char *input)
{
char *v;
struct stek *opers=NULL;
int a, b;
float result;
v=input;
for(int i = 0; v[i] != '\0'; i++)
{
switch(v[i])
{
case '+': opers=push(opers, pop(opers) + pop(opers)); break;
case '-': opers=push(opers, ((a = pop(opers)), (b = pop(opers)), b - a)); break;
case '*': opers=push(opers, pop(opers) * pop(opers)); break;
case '/': opers=push(opers, ((a = pop(opers)), (b = pop(opers)), b / a)); break;
default:
if(isdigit(v[i])) opers=push(opers, 0);
while(isdigit(v[i]))
opers=push(opers, 10*pop(opers) + (v[i++]-'0'));
}
}
result=opers->d;
}
void main()
{
PostAr m1("11 22 /");
}
Вообще-то СНАЧАЛА надо смотреть на задание, и решать, что и как делать, и что должно получиться в результате, и как с этим результатом потом работать. Второй этап - это словесное описание алгоритма. Выразишь словами - сможешь объяснить компьютеру. Не выразишь - даже не пытайся запускать компилятор, у тебя ничего не получится... Третий этап - написание программы. Да, да... Все еще на листе бумаги. И ее "прогон". Угу, на бумаге и "в уме". И только потом можно включать компьютер и набирать программу... Продолжай "воротить" дальше. Я предпочитаю заниматься нормальным проектированием и программированием, а не "наворачиванием" одного, потом другого, потом третьего, изначально не имея на руках ПОЛНОГО Т.З. У тебя в результате получится "спагетти", и ты в нем опять не сможешь разобраться, не говоря уже, чтоб добавить что-нибудь...
Но это уже без меня. Я в этом участия не принимаю.
Четкое задание есть и алгоритм его решения я прекрасно представляю.Почему я сделал сначала программу,а потом переделал в класс....Да потому что на мой взгляд так проще отлаживать и находить ошибки.Делаю я ,как ты выразился с "наварачиванием" потому что я не обладаю таким уровнем программирования,чтобы сделать все и сразу,а потом отлавливать ошибки,они у меня могут наложится одна а другую и тогда будет полный хаос в котором я вовек не разберусь,более того,как выяслилось полный свой проект скидывать мне не имеет смысла, потому что в mfc мне помоч никто не может,а занчит не имеет смысла скидывать все в одну кучу,поэтому я свою главную задачу разбил на некоторое количество независымых подзадач.Насчет моего вопроса..Задал я его потому что для дальнейшего использования это абсолютно не будет иметь никакого значения, буть это функция,она будет вызвана только внутри конструктора и больше никакой надобности в ней нет.Более того я не просил выдавать мне код,я лиш спросил, как будет правильнее сделать
Krjuger, ты во многом по-своему прав, и хорошо, что ты идешь своим путем. Единственное "но": ты долго и старательно отвечал не на то. volvo тебе сказал, что для решения серьезной задачи правильнее будет сначала составить детальный план решения с алгоритмами. Ты действительно хочешь с этим спорить? Если да, то милости прошу в раздел "Дискуссионный клуб" - и получи там по полной программе. Если же нет (и мне кажется, что это так), то никаких слов, кроме "да, конечно" не нужно, и переводить стрелки на совершенно другое и разводить демагогию - незачем. В любом случае, кончай оффтопить в профильном разделе.
Тебе был дан совет по делу. Есть вопросы по его реализации? спрашивай. Нету - поблагодари за помощь. Считаешь, что volvo сказал что-то обидное? поставь ему минус в репу и, снова, иди обсуди в Дискуссиях.
Вопрос считаю исчерпаным, тут мне отвечать не нужно.