GENERAL IRAJ
چهارشنبه 22 آبان 1392, 14:00 عصر
با عرض سلام خدمت دوستان و اساتید عزیز ، با توجه به الگوریتمی که برای من تعریف شده بود دارم برنامه ای برای تبدیل یک عبارت میانوندی به پسوندی می نویسم ، کدش رو هم نوشتم ، ولی ارور می ده:
توضیحات:
برنامه بدین صورت است که یک رشته را به صورت عبارت میانوندی خوانده و پس از تبدیل به پسوندی آن را درون یک پشته کاراکتری ریخته و آن را چاپ می کنیم، تابع PRE برای تشخیص تقدم عملگرها استفاده می کنیم.
از پشته opt برای نگهداری عملگرها و از پشته st1برای نگهداری اعداد( به صورت کاراکتری ) و در انتها برای نگهداری عبارت پسوندی اشتفاده می شود.
#include "stdafx.h"
#include <iostream>
#include <string>
#include <stdlib.h>
#include <stack>
bool pre(char,char);
using namespace std;
int main()
{
string str;
stack<char>st1;
stack<char>opt;
cout <<"please Enter your pharese:\n";
cin >> str;
cout << "your INFIX pherase is :\n" <<endl<<str;
for (int i = 0;i<str.length()-1;i++)
{
char c = str.at(i);
if (i=='+'||i=='*'||i=='-'||i=='/'||i==')'||i=='('||i=='^' && (pre(c,opt.top())==true))
{
opt.push(c);
}
else if(pre(c,opt.top())!=true && st1.empty()!=true)
{
char op1,op2,op;
op1 = st1.top();
st1.pop();
op2 = st1.top();
st1.pop();
op = opt.top();
opt.pop();
st1.push(op1);
st1.push(op2);
st1.push(op);
}
else if (c==')')
{
while (c!='(')
{
char op1,op2,op;
op1 = st1.top();
st1.pop();
op2 = st1.top();
st1.pop();
op = opt.top();
opt.pop();
st1.push(op1);
st1.push(op2);
st1.push(op);
}
}
else // if caracter beetween '0'&&'9'
{
st1.push(c);
}
}
while (st1.empty()!=true)
{
cout <<st1.top();
st1.pop();
}
system("PAUSE");
return 0;
}
bool pre(char op1,char op2)
{
if (op1 == '*'||op1 == '/'&&op2 == '+'||op2 == '-') return true;
if (op1 == op2) return false;
if (op1 == '(' && op2 == '+'||op2 == '*'||op2 == '/'||op2 == '-'||op2== '^') return true;
if (op1 == '+'||op1 == '*'||op1 == '/'||op1 == '-'||op1 == '^' &&op2 == '(') return true;
if (op1 == '+'||op1 == '*'||op1 == '/'||op1 == '-'||op1 == '^' && op2 == '0\'') return true;
}
ایت برنامه در visual studio نوشته شده است.
ارورش هم اینه:
Debuge Assertion fieled
البته تا جایی که عبارت رو چاپ کنه میاد ولی ایراد از جایی که می خواهد وارد حلقه for بشه شروع می شه ،
ولی نمیدونم چیه.
ممنون می شم کمکم کنید.
توضیحات:
برنامه بدین صورت است که یک رشته را به صورت عبارت میانوندی خوانده و پس از تبدیل به پسوندی آن را درون یک پشته کاراکتری ریخته و آن را چاپ می کنیم، تابع PRE برای تشخیص تقدم عملگرها استفاده می کنیم.
از پشته opt برای نگهداری عملگرها و از پشته st1برای نگهداری اعداد( به صورت کاراکتری ) و در انتها برای نگهداری عبارت پسوندی اشتفاده می شود.
#include "stdafx.h"
#include <iostream>
#include <string>
#include <stdlib.h>
#include <stack>
bool pre(char,char);
using namespace std;
int main()
{
string str;
stack<char>st1;
stack<char>opt;
cout <<"please Enter your pharese:\n";
cin >> str;
cout << "your INFIX pherase is :\n" <<endl<<str;
for (int i = 0;i<str.length()-1;i++)
{
char c = str.at(i);
if (i=='+'||i=='*'||i=='-'||i=='/'||i==')'||i=='('||i=='^' && (pre(c,opt.top())==true))
{
opt.push(c);
}
else if(pre(c,opt.top())!=true && st1.empty()!=true)
{
char op1,op2,op;
op1 = st1.top();
st1.pop();
op2 = st1.top();
st1.pop();
op = opt.top();
opt.pop();
st1.push(op1);
st1.push(op2);
st1.push(op);
}
else if (c==')')
{
while (c!='(')
{
char op1,op2,op;
op1 = st1.top();
st1.pop();
op2 = st1.top();
st1.pop();
op = opt.top();
opt.pop();
st1.push(op1);
st1.push(op2);
st1.push(op);
}
}
else // if caracter beetween '0'&&'9'
{
st1.push(c);
}
}
while (st1.empty()!=true)
{
cout <<st1.top();
st1.pop();
}
system("PAUSE");
return 0;
}
bool pre(char op1,char op2)
{
if (op1 == '*'||op1 == '/'&&op2 == '+'||op2 == '-') return true;
if (op1 == op2) return false;
if (op1 == '(' && op2 == '+'||op2 == '*'||op2 == '/'||op2 == '-'||op2== '^') return true;
if (op1 == '+'||op1 == '*'||op1 == '/'||op1 == '-'||op1 == '^' &&op2 == '(') return true;
if (op1 == '+'||op1 == '*'||op1 == '/'||op1 == '-'||op1 == '^' && op2 == '0\'') return true;
}
ایت برنامه در visual studio نوشته شده است.
ارورش هم اینه:
Debuge Assertion fieled
البته تا جایی که عبارت رو چاپ کنه میاد ولی ایراد از جایی که می خواهد وارد حلقه for بشه شروع می شه ،
ولی نمیدونم چیه.
ممنون می شم کمکم کنید.