Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Оценка постфиксного выражения 
V
    Опции темы
qwerty233
Дата 3.5.2011, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 3.10.2010

Репутация: нет
Всего: нет



Написал программу для оценки постфиксных выражений для одноразрядных чисел, а теперь надо написать для многоразрядных чисел усовершенствовав эту программу, может кто посоветует как это сделать, а то на ум ничего не приходит.
Код

#ifndef STACK_H
#define STACK_H

#include <string>
#include <iostream>

template< typename STACKTYPE > class Stack;

template< typename STACKTYPE >
class StackNode
{
    friend class Stack< STACKTYPE >;
public:
    StackNode( const char &str )
        :nextPtr( 0 ), data( str )
    {}
private:
    StackNode< STACKTYPE > *nextPtr;
    STACKTYPE data;
};

template< typename STACKTYPE >
class Stack
{
public:
    Stack()
        :firstPtr( 0 ), lastPtr( 0 )
    {}

    ~Stack()
    {
        StackNode< STACKTYPE > *currentPtr = firstPtr;
        StackNode< STACKTYPE > *tempPtr;

        while( currentPtr != 0 )
        {
            tempPtr = currentPtr;
            currentPtr = currentPtr->nextPtr;
            delete tempPtr;
        }
    }

    void push( const STACKTYPE &pushString )
    {
        StackNode< STACKTYPE > *newPtr = getNewStackNode( pushString );

        if( isEmpty() )
            firstPtr = lastPtr = newPtr;
        else
        {
            newPtr->nextPtr = firstPtr;
            firstPtr = newPtr;
        }
    }

    void pop()
    {
        if( firstPtr == lastPtr )
            firstPtr = lastPtr = 0;
        else
        {
            StackNode< STACKTYPE > *tempPtr = firstPtr;
            firstPtr = firstPtr->nextPtr;
            delete tempPtr;
        }
    }

    bool isEmpty() const
    {
        return firstPtr == 0;
    }

    STACKTYPE stackTop() const
    {
        return firstPtr->data;
    }

    void print() const
    {
        StackNode< STACKTYPE > *printPtr = firstPtr;

        while( printPtr != 0 )
        {
            std::cout << printPtr->data << ' ';
            printPtr = printPtr->nextPtr;
        }
    }
private:
    StackNode< STACKTYPE > *getNewStackNode( const STACKTYPE &newData )
    {
        return new StackNode< STACKTYPE >( newData );
    }
    StackNode< STACKTYPE > *firstPtr;
    StackNode< STACKTYPE > *lastPtr;
};

#endif

Код

#include <iostream>
#include <cmath>
#include <string>
#include "Stack.h"

bool isOperator( const char & );
bool isDigit( const char & );
int evaluatePostfixExpression( Stack< int > &, std::string & );
int calculate( const int &, const char &, const int & );

int main()
{
    Stack< int > stack;
    std::string postfix;

    std::cout << "Enter a postfix expression: ";
    std::getline( std::cin, postfix );

    int answer = evaluatePostfixExpression( stack, postfix );

    std::cout << "Answer is: " << answer << std::endl;
    return 0;
}

bool isOperator( const char &symbolToCheck )
{
    std::string operators( "+-*/^%" );

    for( size_t i = 0; i < operators.length() ; i++ )
        if( symbolToCheck == operators.at( i ) )
            return true;

    return false;
}

bool isDigit( const char &digit )
{
    std::string digits( "0123456789" );

    for( size_t i = 0; i < digits.length(); i++ )
        if( digit == digits.at( i ) )
            return true;
    return false;
}

int calculate( const int &op1, const char &op, const int &op2 )
{    
    int result;
    switch( op )
    {
    case '*': result = op1 * op2;        break;
    case '/': result = op2 / op1;        break;
    case '%': result = op2 % op1;        break;
    case '+': result = op1 + op2;        break;
    case '-': result = op2 - op1;        break;
    case '^': result = pow( static_cast< double >( op2 ), op1 );  break;
    }
    return result;
}

int evaluatePostfixExpression( Stack< int > &s, std::string &postfix )
{
    size_t i = 0;
    int x;
    int y;

    while( i < postfix.length() )
    {
        if( isDigit( postfix.at( i ) ) )
            s.push( static_cast< int >( postfix.at( i ) ) - static_cast< int >( '0' ) );
        else if( isOperator( postfix.at( i ) ) )
        {
            x = s.stackTop();
            s.pop();
            y = s.stackTop();
            s.pop();
            s.push( calculate( x, postfix.at( i ), y ) );
        }
        i++;
        s.print();
    }
    return s.stackTop();
}

PM MAIL   Вверх
xvr
Дата 3.5.2011, 20:32 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(qwerty233 @  3.5.2011,  12:34 Найти цитируемый пост)
Написал программу для оценки постфиксных выражений для одноразрядных чисел, 

 smile 
К хирургу на прием вбегает взъерошенный молодой человек, и с порога требует - Доктор, кастрируйте меня!
- Ну зачем же так, молодой человек, у вас еще вся жизнь впереди ...
- Мне срочно надо!
Ну надо, так надо. Отрезал доктор все, что просили. После операции спрашивает -
- А, если не секрет, зачем?
- Понимаете доктор, я решил женится, а невеста из ортодоксальной еврейской семьи...
- Но у них же делают обрезание!
- А что, я как то неправильно сформулировал???

Может вы все же хотели вычислять постфиксные выражения?

Цитата(qwerty233 @  3.5.2011,  12:34 Найти цитируемый пост)
а теперь надо написать для многоразрядных чисел усовершенствовав эту программу, может кто посоветует как это сделать,

Обратится к тому, кто эту программу писал. Я не верю, что человек написавший это, не в состоянии сделать обработку многоразрядных чисел  smile 

Подсказка - обработка чисел делается в строке 69-70 вашего С++ файла. Откусывайте от входной строки не по 1 цифре, а все (пока они цифры). Что накусаете - и будет числом

PM MAIL   Вверх
qwerty233
Дата 4.5.2011, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 3.10.2010

Репутация: нет
Всего: нет



Если вы не верите что это писал я то это ваши проблемы, но мне действительно не приходит в голову как это сделать и кстати в книге было слово "оценка", а не "вычисление"

Это сообщение отредактировал(а) qwerty233 - 4.5.2011, 14:58
PM MAIL   Вверх
xvr
Дата 4.5.2011, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(qwerty233 @  4.5.2011,  14:55 Найти цитируемый пост)
 книге было слово "оценка", а не "вычисление"

Книгу - 'ф топку'!

Цитата(qwerty233 @  4.5.2011,  14:55 Найти цитируемый пост)
но мне действительно не приходит в голову как это сделать

Зато сделано много велосипедов, так было нужно, или это по незнанию?

Вот ваша обработка (без велосипедов)
Код

#include <iostream>
#include <cmath>
#include <string>
#include <stack>
#include <ctype.h>
#include <string.h>

int evaluatePostfixExpression( std::stack< int > &, std::string & );

int main()
{
    std::stack< int > stack;
    std::string postfix;
    std::cout << "Enter a postfix expression: ";
    std::getline( std::cin, postfix );
    int answer = evaluatePostfixExpression( stack, postfix );
    std::cout << "Answer is: " << answer << std::endl;
    return 0;
}

inline bool isOperator( const char symbolToCheck )
{
  return strchr("+-*/^%",symbolToCheck) != NULL;
}

int calculate( const int &op1, const char &op, const int &op2 )
{    
    int result;
    switch( op )
    {
    case '*': result = op1 * op2;        break;
    case '/': result = op2 / op1;        break;
    case '%': result = op2 % op1;        break;
    case '+': result = op1 + op2;        break;
    case '-': result = op2 - op1;        break;
    case '^': result = pow( static_cast< double >( op2 ), op1 );  break;
    }
    return result;
}

int evaluatePostfixExpression( std::stack< int > &s, std::string &postfix )
{
    size_t i = 0;
    int x;
    int y;
    while( i < postfix.length() )
    {
        if( isdigit( postfix.at( i ) ) )
         {
          const char* p=postfix.c_str();
          char* e;
          s.push( strtoul(p+i,&e,10) );
          i=e-p-1;
         }
        else if( isOperator( postfix.at( i ) ) )
        {
            x = s.top();
            s.pop();
            y = s.top();
            s.pop();
            s.push( calculate( x, postfix.at( i ), y ) );
        }
        i++;
        s.print();
    }
    return s.top();
}

PM MAIL   Вверх
qwerty233
Дата 4.5.2011, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 3.10.2010

Репутация: нет
Всего: нет



Цитата

Зато сделано много велосипедов, так было нужно, или это по незнанию?

По незнанию
PM MAIL   Вверх
borisbn
Дата 4.5.2011, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



а зачем в ф-цию evaluatePostfixExpression передаётся объект stack, созданный в main и который потом не используется ? Не проще объявить его локально в функции, если так уж хочется им пользоваться ?
Ещё. А если в строке только одно число или вообще ни одного, то что будет с 
Цитата

y = s.top();

?


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
qwerty233
Дата 4.5.2011, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 3.10.2010

Репутация: нет
Всего: нет



Цитата

а зачем в ф-цию evaluatePostfixExpression передаётся объект stack, созданный в main и который потом не используется ?

А это у меня привычка такая создавать объекты в main()
Цитата

 А если в строке только одно число или вообще ни одного

Этого я не учёл
PM MAIL   Вверх
qwerty233
Дата 4.5.2011, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 3.10.2010

Репутация: нет
Всего: нет



Главная проблема в том как объяснить программе при вводе например 681+ что тут 6 + 81 или 68 + 1
PM MAIL   Вверх
borisbn
Дата 4.5.2011, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(qwerty233 @  4.5.2011,  17:47 Найти цитируемый пост)
А это у меня привычка такая создавать объекты в main()

почему ж тогда
Цитата(xvr @  4.5.2011,  15:45 Найти цитируемый пост)

size_t i = 0;
int x;
int y;

не в main объявлены, а локально в ф-ции ? smile

Цитата(qwerty233 @  4.5.2011,  18:24 Найти цитируемый пост)
Главная проблема в том как объяснить программе при вводе например 681+ что тут 6 + 81 или 68 + 1

вообще никак. нужно вводить 68 1+ или 68,1+


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
qwerty233
Дата 4.5.2011, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 3.10.2010

Репутация: нет
Всего: нет



Цитата

вообще никак. нужно вводить 68 1+ или 68,1+

Тогда проблема решена
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1122 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.