ايران ويج

نسخه‌ی کامل: راهنمایی در مورد الگوریتم تبدیل عبارت infix به prefix
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
صفحه‌ها: 1 2
سلام دوستان.
به برنامه یا الگوریتم تبدیل عبارت میانوندی به پیشوندی نیاز داشتم ، اگر کسی بلده و براش ممکنه برام لود کنه.
مرسی.
دوست من سلام

این بحث قبلا توی فروم شده بود . شما میتونید به لینک زیر مراجعه کنید :

http://forum.iranled.com/showthread.php?tid=2672
سلام دوستان
یه سوال داشتم.
ممنون میشم کمکم کنید.
یک پشته خالی با اعداد از 1 تا 6 از ورودی داده شده است.با اعمال pop ,push کدام یک از گزینه های زیر را نمی توان با هیچ ترتیبی از اعمال فوق به دست آورد؟
a)123564 b)324651
c)432165 d)215346
pop وpushرا تعریف کن.
گزینه d رو با هیچ ترتیبی نمیشه بدست آورد . برای اینکه بتونیم این گزینه رو هم در بیاریم باید جای ارقام 3 و 4 رو باهم عوض کنیم یا در واقع داشته باشیم 215436 . حالا علت کجاست ؟؟ من ترتیب اعمال رو مینویسم و شما خودتون متوجه خواهید شد چرا . برای ایجاد جواب 215346 مراحل زیر رو قدم به قدم انجام میدیم :

ابتدا 1 رو باید توی پشته قرار بدیم ( 1 پس توی پشته هست )
2 رو مستقیما به جواب اضافه میکنیم ( جواب ما تا اینجا 2 هست )
1 رو از پشته pop میکنیم و به جواب اضافه میکنیم ( جواب بدست آمده تا اینجا 21 هست و پشته خالیه )
3 رو باید توی پشته قرار بدیم ( 3 پس توی پشته هست و پایین ترین عضو پشته )
4 رو باید توی پشته قرار بدیم ( 4 3 توی پشته هستند و 4 بالاترین هست)
5 رو مستقیما به جواب اضافه میکنیم ( جواب ما تا اینجا 215 هست )
حالا توی این مرحله باید طوری عمل کنیم که 3 توی جواب ما قرار بگیره تا درواقع بتونیم 2153 رو تشکیل بدیم اما 3 در پایین پشته قرار داره و چون عضو بالایی پشته نیست تمیتونیم از پشته خارجش کنیم در نتیجه هیچ راهی نیست که بشه 3 رو خارج کنیم و 215246 رو بسازیم .

خاصیت LIFO بودن پشته به ما این امکان رو نمیده . حالا فقط کافیه جای ارقام 3 و 4 رو توی گزینه عوش کنی . خیلی راحت جواب 215436 رو میتونی بدست بیاری !
ممنون خیلی مطلبت بخصوص در مورد عبارات پسوندی و میانوندی جالب بود.
تا باشه از این بحث های جالب باشه.
salam
shoma barname infix be postfix ro goftid age momkene infix be prefix ro ham begid.mer30
لطفا برنامه تبدیل infix به prefix را بنویسید
من کدشو قبلا نوشتم تازه یه کار دیگه هم میکنه بجای عملوند هایی که بهش دادی عدد ازت میخاد و جواب عبارت هم بهت میگه:

کد:
#include <iostreame.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
    char infix[255],prefix[255];
struct node
{
char info;
struct node *link;
}*start,*temp,*end;
struct operand
{
char oper;
int value;
struct operand *link;
}*one,*t,*n;

void add2stack(char ch)
{
   temp=(struct node *) malloc(sizeof(node));
   temp->info=ch;
   temp->link=start;
   if(start==NULL)
   {
     temp->link=NULL;
     end=start=temp;
   }
   else
     start=temp;
}
char getstack()
{
   char temp;
   temp=start->info;
   start=start->link;
   return temp;
}
void addoperand(char o,int v)
{
   t=one;
   while(t)
   {
      if(t->oper==o){ t->value=v;return;}
      t=t->link;
   }
   t=(struct operand *) malloc(sizeof(operand));
   t->oper=o;
   t->value=v;
   t->link=NULL;
   if(one==NULL)
   {
   n=one=t;
   }
   else
   {
   n->link=t;
   n=t;
   }
}
int getvalue(char o)
{
   t=one;
   while(t)
   {
      if(t->oper==o) return(t->value);
      t=t->link;
   }
//   return 0;
}
int power(char ch)
{
      if(ch=='+' || ch=='-') return 1;
      if(ch=='*' || ch=='/') return 2;

return 0;
}
void citop()
{
   int i=0,k=0;
   for(i=strlen(infix);i>=0;i--)
      infix[i+1]=infix[i];
   infix[0]='(';
   infix[strlen(infix)]=')';
   char gtst;
   for(int j=0;j<strlen(infix);j++)
   {
      if(infix[j]=='(') add2stack(infix[j]);
      if((infix[j]!='(')&&(infix[j]!=')')&&(infix[j]!='+')&&(infix[j]!='-')&&(infix[j]!='*')&&(infix[j]!='/')) prefix[k++]=infix[j];
      if(infix[j]==')')
     while((gtst=getstack())!='(')
        prefix[k++]=gtst;
      if((infix[j]=='+')||(infix[j]=='-')||(infix[j]=='*')||(infix[j]=='/'))
      {

      while((power(start->info)) >= (power(infix[j])))
           prefix[k++]=getstack();
      add2stack(infix[j]);
      }
   }
}
void comput(char posfix[])
{
int k;
char cha,chb;
int inta=0,intb=0,ans=0;
    for(k=0;k<strlen(posfix);k++)
    {
     if((posfix[k]!='+')&&(posfix[k]!='-')&&(posfix[k]!='*')&&(posfix[k]!='/'))
          add2stack(posfix[k]);
     else {

        cha=getstack();
        chb=getstack();
        inta=getvalue(cha);
        intb=getvalue(chb);
        switch(posfix[k]){
            case '+':ans=inta+intb;
                 break;
            case '-':ans=intb-inta;
                 break;
            case '*':ans=inta*intb;
                 break;
            case '/':ans=intb/inta;
                 break;
                 }
        addoperand('@',ans);
        add2stack('@');

          }
    }
}
int instr(char str[],char key)
{
int i=0;
   while(str[i])
     if(str[i]==key)
       return i;
     else i++;
}
void inoperand(char ops[])
{
int tmpnum,q;
   for(q=0;q<strlen(ops);q++)
   {
       if((ops[q]!='+')&&(ops[q]!='-')&&(ops[q]!='*')&&(ops[q]!='/'))
       {
       if(instr(ops,ops[q])==q){
          cout<<"\ninput "<<ops[q]<<":",cin>>tmpnum;
          addoperand(ops[q],tmpnum);
                   }
       }
   }
}
void main()
{
clrscr();
    cout<<"infix >",cin>>infix;
    citop();
    start=end=NULL;
    cout<<"\nPosfix Is:" << prefix<<"\n";
    inoperand(prefix);
    comput(prefix);

    cout<<"Resault:"<<getvalue(getstack());//<<one->link->value;
getch();
}
(۰۵-خرداد-۱۳۸۶, ۱۷:۵۹:۴۵)Mamad2003 نوشته است: [ -> ]دوست من سلام

این بحث قبلا توی فروم شده بود . شما میتونید به لینک زیر مراجعه کنید :

http://forum.iranled.com/showthread.php?tid=2672


تبدیل عبارات infix به prefixبا استفاده از class
صفحه‌ها: 1 2