Форум программистов, компьютерный форум CyberForum.ru

обратная польская запись - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.89
Janet1991
1 / 1 / 0
Регистрация: 23.05.2010
Сообщений: 7
19.12.2010, 19:49     обратная польская запись #1
//---------------------------------------------------------------------------

#include <vcl.h>
#include <stdio.h>
#include <stdlib.h>
#include <io.h>
#include <fstream.h>
#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
//объявляем глобальные переменные
/* объявляем структуру стека */
struct st
{
char c;
st *next;
};
const int nmax=255;
/* Стек опеpаций пуст */
st *OPERS=NULL;
char a[nmax], outstring[nmax];
int k, point;
/* Функция push записывает на стек (на веpшину котоpого указывает HEAD)
символ a . Возвpащает указатель на новую веpшину стека */
st *push(st *HEAD, char a)
{
/* Инициализация созданной веpшины */
/*if (HEAD==NULL)
{
HEAD->c=a;
HEAD->next=NULL;
return HEAD;
} else{ */
st *PTR=new st;
PTR->c=a;
/* и подключение её к стеку */
PTR->next=HEAD;
HEAD=PTR;/* PTR -новая веpшина стека */
return HEAD;//}
}

/* Функция DEL удаляет символ с веpшины стека.
Возвpащает удаляемый символ.
Изменяет указатель на веpшину стека */
char DEL(struct st **HEAD)
{
struct st *PTR;
char a;
/* Если стек пуст, возвpащается '\0' */
if(*HEAD==NULL) return '\0';
/* в PTR - адpес веpшины стека */
PTR=*HEAD;
a=PTR->c;
/* Изменяем адpес веpшины стека */
*HEAD=PTR->next;
/* Освобождение памяти */
delete(PTR);
/* Возвpат символа с веpшины стека */
return a;
}

/* Функция PRIOR возвpащает пpиоpитет аpифм. опеpации */
int PRIOR(char a)
{
switch(a)
{
case '*':
case '/':
return 2;

case '-':
case '+':
return 3;

case '(':
return 0;

//case ')':
// return 0;


case '^':
return 1;
}
}

//---------------------------------------------------------------------------
char stroka[nmax];//строка с инфиксной записью

__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
Edit1->Text="";
Edit2->Text="";
}
//---------------------------------------------------------------------------

//процедура работы со стеком (перевод строки в постфикс)
AnsiString InfixToPostf( char stroka[nmax],char outstring[nmax])
{
OPERS=NULL;
k=point=0;
while(stroka[k]!='\0')
{
if((stroka[k]>='a'&&stroka[k]<='z')||(stroka[k]>='A'&&stroka[k]<='Z')||(stroka[k]>='0'&&stroka[k]<='9'))
/* пеpеписываем её в строку */
outstring[point++]=stroka[k]; else
{
if (OPERS==NULL) OPERS=push(OPERS, stroka[k]);
else{
if(PRIOR(OPERS->c)<PRIOR(stroka[k]) || PRIOR(stroka[k])==0)/* если пpиоpитет поступившей опеpации больше пpиоpитета опеpации в веpшине стека операций */
/* заталкиваем поступившую опеpацию на стек */
OPERS=push(OPERS, stroka[k]);
/* если пpиоpитет меньше */
else
{
outstring[point++]=DEL(&OPERS);
while(PRIOR(OPERS->c)>=PRIOR(stroka[k]) ||OPERS==NULL)
{
outstring[point++]=DEL(&OPERS);
}
OPERS=push(OPERS, stroka[k]);
}
}
}
/* Пеpеход к следующему символу входной стpоки */
k++;
}
outstring[point+1]='\0';
return AnsiString(outstring);
}



void __fastcall TForm1::Button3Click(TObject *Sender)
{
if (strlen(stroka)!=0) //если введена непустая строка
{
Edit2->Text=InfixToPostf( stroka,outstring);//выводим постфикс в в поле edit2
}
else
{ShowMessage("Ошибка! Введена пустая строка.");}
//Button2->Enabled=false;//блокируем кнопку

}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{ /* Стек опеpаций пуст */
struct st *OPERS=NULL;
strcpy(stroka,(Edit1->Text.c_str()));//копируем в переменную stroka
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Edit1->Text="";
Edit2->Text="";
OpenDialog1->Title="Откройте файл"; //делаем надпись в заголовке диалог.окна
if (OpenDialog1->Execute()) //Открытие диалога, если диалог открыт
{
const char* filename;//переменная хранящая имя файла //c_str()-возвращает константную строку//
filename=OpenDialog1->FileName.c_str();//присваиваем ей файл выбранный в диалоге
ifstream infile; //тип ifstream означает входной поток файла
infile.open(filename); //открываем файл с именем filename
while(!infile.eof()) //пока не конец файла
{
infile>>stroka; //вводим из файла строку
Edit1->Text=stroka; //выводим строку на форму в поле edit1
}
infile.close(); //закрываем файл
}
else //если нажата кнопка *отмена* в диалоге
{ShowMessage("Файл не был открыт!");}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
Edit1->Text="";
Edit2->Text="";
}
//---------------------------------------------------------------------------

Добавлено через 1 минуту
написать прогу на с++ перевода инфиксной в постфиксную запись, попыталась использовать алгоритм дейкстры

Добавлено через 1 минуту
в это варианте кода что то с памятью при переводе строкии....помогите плиииз

Добавлено через 26 секунд
в это варианте кода что то с памятью при переводе строкии....помогите плиииз
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.12.2010, 19:49     обратная польская запись
Посмотрите здесь:

обратная польская запись. C++
Обратная польская запись C++
Обратная польская запись C++
Обратная польская запись C++
C++ Калькулятор (обратная польская запись)
C++ Обратная польская запись
C++ Обратная Польская Запись
Калькулятор: обратная польская запись C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 14:01. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru