PDA

View Full Version : حرفه ای: تبدیل عبارات پیشوندی پسوندی میانوندی



rezasheshbolooki
چهارشنبه 25 آبان 1390, 09:34 صبح
با سلام. من دوتا سوال داشتم.

1- عبارت میانوندی با پرانتز از کاربر گرفته و پیشوندی و پسوندی را در دوخط چاپ نتیچه فاقد پرانتز.

2- یک عبارت پیشوندی فاقد پرانتز گرفته به پسوندی تبدیل کند

2تا فایل هم میزارم که یکیشون تمام کارهارو انجام میده و یکیشون فقط یکی از تبدیل هارو انجام میده!

با تشکر فراوان.


// the program is used to convert a infix expression to a postfix expression

#include<iostream.h>
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>



const int size =50;
char infix[size],postfix[size],stack[size];
int top=-1;

int precedence(char ch); // function to get the precedence of the operator
char pop(); //function to pop an element from the stack
char topelement(); // returns the top element of the stack
void push(char ch); // pushes an element into the stack



int main()
{
char ele,elem,st[2];
int prep,pre,popped,j=0,chk=0;
strcpy(postfix," ");

gets(infix);

for(int i=0;infix[i]!=0;i++)
{
if(infix[i]!='('&&infix[i]!=')'&&infix[i]!='^'&&infix[i]!='*'&&infix[i]!='/'&&infix[i]!='+'&&infix[i]!='-')
postfix[j++]=infix[i];
else if(infix[i]=='(')
{
elem=infix[i];
push(elem);
}
else if(infix[i]==')')
{
while(popped=pop() != '(')
postfix[j++]=popped;
}
else
{
elem=infix[i];
pre=precedence(elem);//stores the precedence of operator coming frm infix
ele=topelement();
prep=precedence(ele);//stores the precedence of operator at the top of the stack

if(pre > prep)
push(elem);

else
{
while(prep >= pre)
{
if(ele=='#')
break;
popped=pop();
ele=topelement();
postfix[j++]=popped;
prep=precedence(ele);
}
push(elem);
}
}
}

while((popped=pop())!='#')
postfix[j++]=popped;
postfix[j]='\0';

cout<<"\n post fix :"<<postfix<<endl;

system("pause");
return 0;
} 

int precedence(char ch)
{
switch(ch)
{
case '^' : return 5;
case '/' : return 4;
case '*' : return 4;
case '+' : return 3;
case '-' : return 3;
default : return 0;
}
}

char pop() //function to pop the element from the stack
{
char ret;
if(top!=-1)
{ ret =stack[top];
top--;
return ret;
}
else
return '#';
}

char topelement() // function to return top element from the stack without popping
{
char ch;
if(top!=-1)
ch=stack[top];
else
ch='#';
return ch;
}

void push(char ch) // function to push an element in the stack
{
if(top!=size-1)
{
top++;
stack[top]= ch;
}
}

__________________________________________________ __________________________________________________ _____________



// the program is used to convert a infix expression to a perfix expression and infix expression to a postfix expression and perfix expression to a infix expression.
//in barname baraye tabdile ebarate mian vandi be pishvandi va pasvandi va pishvandi be mianvandi neveshte shode ast.
#include<iostream.h>
void intoper();
void intopost();
void pertoin();
void main()
{
while(1)
{
cout<<"\n\n 1- infix be perfix \t 2- infix be postfix" ;
cout<<"\n\n 3- perfix be infix 4- exit\n\n" ;
cout<<" gozineh morede nazar? : ";
int y;
cin>>y;

switch(y) // switch baraye gozine entekhab shode
{
case 1:
intoper();
break;

case 2:
intopost();
break;

case 3:
pertoin();
break;

}

if(y>=4)break;
}

}



void intoper()
{
char q[40]={0};
char p[40]={0};
char s[40]={0};
char r[40]={0};
int cq=0,cp=0,cs=0,j,i,n,k=0;
cout<<"\n\t enter infix expression:";
cin>>q;
for(i=0;i<40;i++)
{
if(q[i]==0)
{
break;
}
}
n=i;
s[cs]=41;
cs++;
for(i=n;i>=0;i--)
{
q[i+1]=q[i];
}
q[cq]=40;
cq++;
for(i=0;i<=n;i++)
{
cout<<q[i];
}
cout<<"\n";
for(j=n;j>=0;j--)
{
if((q[j]>=65 && q[j]<=90) || (q[j]>=97 && q[j]<=122))
{
p[cp]=q[j];
cp++;
}
if(q[j]==41)
{
s[cs]=q[j];
cs++;
k++;
}
if(q[j]==42 || q[j]==43 || q[j]==45 || q[j]==47)
{
for(;1;)
{
if(q[j]==43 || q[j]==45)
{
if(s[cs-1]==42 || s[cs-1]==47 || s[cs-1]==43 || s[cs-1]==45)
{
p[cp]=s[cs-1];
s[cs]=0;
cs--;
cp++;
}
else
{
s[cs]=q[j];
cs++;
break;
}
}
else if(q[j]==42 || q[j]==47)
{
if(s[cs-1]==42 || s[cs-1]==47)
{
p[cp]=s[cs-1];
s[cs]=0;
cs--;
cp++;
}
else
{
s[cs]=q[j];
cs++;
break;
}
}
}
}

if(q[j]==40)
{
k++;
for(;1;)
{
if(s[cs-1]==41)break;
p[cp]=s[cs-1];
s[cs]=0;
cs--;
cp++;
}
s[cs]=0;
cs--;
}
for(i=0;i<=n;i++)
{
cout<<s[i];
}

cout<<"\n";
for(i=n;i>=0;i--)
{
cout<<p[i];
}
cout<<"\n\n";
}
cout<<"\n\n";
for(i=n,j=0;i>=0;j++,i--)
{
r[j]=p[i];
cout<<p[i];
}
cout<<"\n";
for(i=k;i<40;i++)
{
r[i-k]=r[i];
}
cout<<"\n natije:\n\t";
for(i=0;i<40;i++)
{
cout<<r[i];
}
cout<<"\n";
};




void intopost()
{
char q[50]={0};
char p[50]={0};
char s[50]={0};
int cs=0,cp=0,cq=0,j,i,n;
cout<<"\n\t enter infix expression: ";
cin>>q;
for(i=0;i<50;i++)
{
if(q[i]==0)
{
n=i;
break;
}
}
n=i;
q[i]=41;
for(i=0;i<50;i++)
{
cout<<q[i];
}
cout<<"\n";
s[cs]=40;
cs++;
for(j=0;j<=n;j++)
{
if((q[j]>=65 && q[j]<=90) || (q[j]>=97 && q[j]<=122))
{
p[cp]=q[j];
cp++;
}
if(q[j]==40)
{
s[cs]=q[j];
cs++;
}
if(q[j]==42 || q[j]==43 || q[j]==45 || q[j]==47)
{
for(;1;)
{
if(q[j]==43 || q[j]==45)
{
if(s[cs-1]==42 || s[cs-1]==47 || s[cs-1]==43 || s[cs-1]==45)
{
p[cp]=s[cs-1];
s[cs]=0;
cs--;
cp++;
}
else
{
s[cs]=q[j];
cs++;
break;
}
}
else if(q[j]==42 || q[j]==47)
{
if(s[cs-1]==42 || s[cs-1]==47)
{
p[cp]=s[cs-1];
s[cs]=0;
cs--;
cp++;
}
else
{
s[cs]=q[j];
cs++;
break;
}
}
}
}

if(q[j]==41)
{
for(;1;)
{
if(s[cs-1]==40)break;
p[cp]=s[cs-1];
s[cs]=0;
cs--;
cp++;

}
if(s[cs]=40)
{
s[cs]=0;
cs--;
}

}
for(i=0;i<=n;i++)
{
cout<<s[i];
}

cout<<"\n";
for(i=0;i<=n;i++)
{
cout<<p[i];
}
cout<<"\n\n";
}
cout<<"\n natije: \n\t";
for(i=0;i<20;i++)
{
cout<<p[i];
}
cout<<"\n";
}



struct str
{
char s[45];
};
str a[45];



void pertoin()
{
char q[45]={0};
char p[45]={0};
char r[45]={0};
int cs=0,cq=0,cr=0,ca=0,i,j,k,l,n,m;
cout<<"\n\t enter prefix expression:";
cin>>q;
for(i=0;i<45;i++)
{
if(q[i]==0)
{
n=i;
break;
}
}
n=i-1;
for(j=n;j>=0;j--)
{
cr=0;
for(i=0;i<45;i++)
{
r[i]=0;
}
if((q[j]>=65 && q[j]<=90) || (q[j]>=97 && q[j]<=122))
{
a[ca].s[cs]=q[j];
ca++;
}
if((j==n-1)&&(q[j]==42 || q[j]==43 || q[j]==45 || q[j]==47))
{
for(i=0;i<45;i++)
{
if(a[ca-1].s[i]==0)
{
k=i;
break;
}
}
r[cr]=q[j];
for(i=0;i<k;i++)
{
r[i+1]=a[ca-1].s[i];
}
for(i=0;i<45;i++)
{
a[ca-1].s[i]=0;
}
ca--;
for(i=0;i<k+1;i++)
{
a[ca].s[i]=r[i];
}
ca++;
}
else if(q[j]==42 || q[j]==43 || q[j]==45 || q[j]==47)
{
for(i=0;i<45;i++)
{
if(a[ca-1].s[i]==0)
{
k=i;
break;
}
}
for(i=0;i<45;i++)
{
if(a[ca-2].s[i]==0)
{
l=i;
break;
}
}
r[0]=40;
for(i=0;i<k;i++)
{
r[i+1]=a[ca-1].s[i];
}
r[k+1]=q[j];
for(i=0;i<l;i++)
{
r[i+k+2]=a[ca-2].s[i];
}
r[l+k+2]=41;
for(i=0;i<45;i++)
{
a[ca-1].s[i]=0;
a[ca-2].s[i]=0;
}
ca=ca-2;
for(i=0;i<k+l+3;i++)
{
a[ca].s[i]=r[i];
}
ca++;
}
for(i=0;i<n*2;i++)
{
cout<<a[i].s<<"\n";
}
cout<<"\n=========================\n";
for(i=0;i<45;i++)
{
cout<<r[i];
} 
cout<<"\n=========================\n";
}
for(i=0;i<n;i++)
{
if(a[i].s[i]==0)
{
m=i;
break;
}
}
m=i-1;
if(m>0)
{
for(j=m;j>0;j--)
{
for(i=0;i<n;i++)
{
if(a[ca-1].s[i]==0)
{
k=i;
break;
}
}
for(i=0;i<n;i++)
{
if(a[ca-2].s[i]==0)
{
l=i;
break;
}
}
for(i=0;i<l;i++)
{
r[i]=a[ca-2].s[i];
}
for(i=0;i<k;i++)
{
r[i+l]=a[ca-1].s[i];
}
for(i=0;i<n;i++)
{
a[ca-1].s[i]=0;
a[ca-2].s[i]=0;
}
ca=ca-2;
for(i=0;i<k+l;i++)
{
a[ca].s[i]=r[i];
}
ca++;
for(i=0;i<n;i++)
{
cout<<a[i].s<<"\n";
}
cout<<"\n=========================\n";
for(i=0;i<n;i++)
{
cout<<r[i];}
cout<<"\n=========================\n";}}

cout<<"\n";
for(i=0;i<3;i++)
{
for(j=n;j>=0;j--)
{
cout<<a[i].s[j];
}
cout<<"\n";
}
}

72golsa
سه شنبه 05 اردیبهشت 1391, 12:15 عصر
باعرض سلام الگوریتم تبدیل عبارت میانوندی به پیشوندی رو دارم میخوام با یه کم تغییر در همین برنامه خودم , برعکسشو انجام بده یعنی پیشوندی به میانوندی میشه کمکم کنید؟
اینم برنامه:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using stackLibrary;
namespace converttopost
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
int len;
private void btnconvert_Click(object sender, EventArgs e)
{


len = txtin.Text.Length;
char[] infix = new char[len];
char[] postfix = new char[len];
txtin.Text.CopyTo(0, infix, 0, len);
//int size = Convertintopost(infix, postfix);
int size = convert (infix, postfix);
for (int i = 0; i < size; i++)
txtpost.Text += postfix[i];


}
//public int Convertintopost(char[] infix, char[] postfix)
//{
// int j = 0;
// char symbol;
// object topsymbol ;
// bool underflow;
// stack s = new stack();
// for (int i = 0; i < len; i++)
// {
// symbol = infix[i];


// if (isoperand(symbol))
// postfix[j++] = symbol;
// else if (symbol == '(')
// s.push(symbol);
// else if (symbol == ')')
// {
// topsymbol =s.pop();
// while (topsymbol != '(')
// {
// postfix[j++] = topsymbol;


// topsymbol = s.pop();
// }
// }
// else
// {
// s.topandtest(ref topsymbol, out underflow);
// if (s.isempty() || pred(symbol, Convert.ToChar(topsymbol)) == true)
// s.push(symbol);
// else
// {
// while (pred(Convert.ToChar(topsymbol), symbol) && !underflow)
// {
// s.popandtest(ref topsymbol, out underflow);
// postfix[j++] = Convert.ToChar(topsymbol);
// s.topandtest(ref topsymbol, out underflow);
// }
// s.push(symbol);
// }
// }


// }
// while (!s.isempty())
// {
// postfix[j++] = Convert.ToChar(s.pop());


// }
// return j;
//}
public bool isoperand(char symbol)
{
if (symbol >= '0' && symbol <= '9')
return true;
else
return false;


}
bool pred(char op1, char op2)
{
int i, p1, p2;
p1 = 0;
p2 = 0;
char[] op = { '(', '+', '-', '*', '/' };
int[] iop = { 0, 10, 10, 20, 20 };
for (i = 0; i < 5; i++)
if (op[i] == op1)
{
p1 = i;
break;
}
for (i = 0; i < 5; i++)
if (op[i] == op2)
{
p2 = i;
break;
}
if (iop[p1] > iop[p2])
return true;
else
{
return false;
}
}


public int convert(char[] infix, char[] prefix)
{
{
int j = 0;
char symbol;
object topsymbol = 0;
bool underflow;
stack s1 = new stack();
stack s2 = new stack();
for (int i = len - 1; i >= 0; i--)
{
symbol = infix[i];
if (symbol == ')')
s1.push(symbol);


if (isoperand(symbol))
s2.push(symbol);
else if (symbol == '(')
{
topsymbol = s1.pop();
while (Convert.ToChar(topsymbol) != ')')
{
s2.push(Convert.ToChar(topsymbol));


topsymbol = s1.pop();
}


}


else
{
s1.topandtest(ref topsymbol, out underflow);
if (s1.isempty() || pred(symbol, Convert.ToChar(topsymbol)) == true)
s1.push(symbol);
else
{
while (pred(Convert.ToChar(topsymbol), symbol) && !underflow)
{
s1.popandtest(ref topsymbol, out underflow);
s2.push(Convert.ToChar(topsymbol));
s1.topandtest(ref topsymbol, out underflow);
}
s2.push(symbol);
}
}


}
while (!s1.isempty())
{
s2.push (Convert.ToChar(s1.pop()));


}
while (!s2.isempty())
{
prefix[j++]= (Convert.ToChar(s2.pop()));

}
return j;


}
}


private void button1_Click(object sender, EventArgs e)
{


len = txtin.Text.Length;
char[] infix = new char[len];
char[] prefix = new char[len];
txtin.Text.CopyTo(0, infix, 0, len);
int size = convert(infix, prefix);
for (int i = 0; i < size; i++)
textBox1 .Text += prefix[i];
}


}
}