نمایش نتایج 1 تا 11 از 11

نام تاپیک: الگوریتم تبدیل عبارت میانوند به پیشوند

  1. #1
    کاربر دائمی آواتار behnam_dr
    تاریخ عضویت
    اردیبهشت 1385
    محل زندگی
    مشهد
    سن
    40
    پست
    133

    Tick الگوریتم تبدیل عبارت میانوند به پیشوند

    سلام .از مدیر انجمن خواهشمندم تذکر برای تکراری عنوان کردن این مساله نفرمائید .چون هیچ کس پاسخی درست در این باره نداده لطفا یه الگوریتم صحیح رو یه نفر توضیح بده .

    متشکرم

  2. #2
    مدیر بخش آواتار whitehat
    تاریخ عضویت
    مهر 1382
    محل زندگی
    شیراز
    پست
    2,175
    من الگوریتم برای نوشتن برنامه آنرا توضیح می دهم (قبلا برنامه آن در این بخش گذاشته شده)
    برای نوشتن آن شما نیاز به یک پشته (پشته A) و یک تابع عملگر دارید که آنرا بعدا توضیح می دهم، لازم به تذکر است که برای این الگوریتم چند راه حل وجود داره که ساده ترین راه حل آنرا می نویسم که از یک پشته اضافی (پشته B) استفاده می کند
    --------------------------------

    1- جمله میانوندی را از ورودی بخوانید
    2- از انتهای رشته شروع به پیمایش کنید
    3- یک کاراکتر بخوان
    4- اگر به عملوند رسیدیم آنرا در پشته B اضافه (Push) می کنیم
    5- والا اگر به یک عملگر رسیدیم :
    1-5- اگر پشته A خالی بود عملگر را به پشته A اضافه می کنیم
    2-5-اگر اولویت عملگر فعلی از اولویت عملگر بالای پشته A بیشتر بود آنرا به پشته A اضافه می کنیم
    3-5-اگر اولویت عملگر فعلی از اولویت عملگر بالای پشته A کمتر بود از پشته A آنقدر Pop می کنیم تا به عملگری برسیم که اولویت آن از عملگر فعلی بیشتر باشد
    6-آیا پیمایش جمله ورودی پایان یافته
    1-6-خیر، اشاره گر کاراکتر را یکی کم کن و به مرحله 3 برو
    2-6- بلی به مرحله بعد برو
    7- اگر پشته A خالی نیست تمام عناصر آنرا Pop و به پشته B اضافه کن
    8- پشته B را خالی کن و هر کاراکتر Pop شده را در خروجی درج کن
    ---------------------------------
    تابع عملگر
    -پرانتز بسته تحت هر شرایطی در پشته درج می شود یعنی اولویت آن از همه عملگر ها بیشتر است
    -پرانتز باز همیشه تمام عناصر پشته را Pop می کند تا به یک پرانتز بسته برسد و بعد از آنکه پرانتز بسته pop شد به سراغ کاراکتر بعدی می رویم
    -اولویت ضرب و تقسیم از جمع و منها بیشتر است
    -اولویت دو عملگر یکسان مانند -+،++،--،-+،*/،//،**،*/ کمتر است یعنی مثلا + روی - یا + قرار نمی گیرد
    اگر تابع عملگر را بصورت( Eval(OP1,OP2 فرض کنیم که OP1 عنصر ورودی و OP2 عنصر بالای پشته باشد آنرا می توانید به صورت زیر بنویسید

    Eval(OP1,OP2)=True If OP1<OP2
    Eval(OP1,OP2)=False If OP1>OP2
    Eval(OP1,OP2)=False If OP1=Op2
    Eval(')',OP)=False
    Eval(OP,'(')=True
    Eval(OP,')')=False

    تابع Eval در صورتی که True بود عملیات Pop انجام می شود تا زمانیکه False شود یا رشته تمام شود و در صورتی که False باشد عمل push انجام می شود
    دقت کنید که ) یا ( در پشته B درج نمی شود
    این الگوریتم راه حل بازگشتی ساده دیگری نیز دارد و همینطور شما می توانید به جای استفاده از پشته دوم رشته را از انتها در زمان پردازش چاپ کنید
    لطفا روش را بررسی کنید و اگر سوالی داشتید بپرسید (امیدوارم جایی اشتباه نکرده باشم :) )
    موفق باشید
    To follow the path:
    Look to the master
    Follow the master
    Walk with the master
    See through the master
    Become the master

  3. #3

    نقل قول: الگوریتم تبدیل عبارت میانوند به پیشوند

    سلام با تشکر از شما که الگوریتم میانوندی به پیشوندی در اختیار ما گذاشتید اگر براتون امکان دارد توضیح همراه با برنامه باشد

  4. #4

    نقل قول: الگوریتم تبدیل عبارت میانوند به پیشوند

    الگوریتمی برای تبدیل یک عبارت میانوندی به یک عبارت پیشوندی یا لهستانی میخواستم که مثلا با دریافت
    a+b
    عبارت ab+ را ایجاد کند و یا با دریافت

    (a+b)*(c-(d/f)*h)

    عبارت

    ab-c*/dfh+*
    را تولید کند[/quote]

  5. #5

    نقل قول: الگوریتم تبدیل عبارت میانوند به پیشوند

    می شه بر نا مه ان را دباره روی سیت بگذارید متشکر

  6. #6

    نقل قول: الگوریتم تبدیل عبارت میانوند به پیشوند

    نقل قول نوشته شده توسط whitehat مشاهده تاپیک
    من الگوریتم برای نوشتن برنامه آنرا توضیح می دهم (قبلا برنامه آن در این بخش گذاشته شده)
    برای نوشتن آن شما نیاز به یک پشته (پشته A) و یک تابع عملگر دارید که آنرا بعدا توضیح می دهم، لازم به تذکر است که برای این الگوریتم چند راه حل وجود داره که ساده ترین راه حل آنرا می نویسم که از یک پشته اضافی (پشته B) استفاده می کند
    --------------------------------

    1- جمله میانوندی را از ورودی بخوانید
    2- از انتهای رشته شروع به پیمایش کنید
    3- یک کاراکتر بخوان
    4- اگر به عملوند رسیدیم آنرا در پشته B اضافه (Push) می کنیم
    5- والا اگر به یک عملگر رسیدیم :
    1-5- اگر پشته A خالی بود عملگر را به پشته A اضافه می کنیم
    2-5-اگر اولویت عملگر فعلی از اولویت عملگر بالای پشته A بیشتر بود آنرا به پشته A اضافه می کنیم
    3-5-اگر اولویت عملگر فعلی از اولویت عملگر بالای پشته A کمتر بود از پشته A آنقدر Pop می کنیم تا به عملگری برسیم که اولویت آن از عملگر فعلی بیشتر باشد
    6-آیا پیمایش جمله ورودی پایان یافته
    1-6-خیر، اشاره گر کاراکتر را یکی کم کن و به مرحله 3 برو
    2-6- بلی به مرحله بعد برو
    7- اگر پشته A خالی نیست تمام عناصر آنرا Pop و به پشته B اضافه کن
    8- پشته B را خالی کن و هر کاراکتر Pop شده را در خروجی درج کن
    ---------------------------------
    تابع عملگر
    -پرانتز بسته تحت هر شرایطی در پشته درج می شود یعنی اولویت آن از همه عملگر ها بیشتر است
    -پرانتز باز همیشه تمام عناصر پشته را Pop می کند تا به یک پرانتز بسته برسد و بعد از آنکه پرانتز بسته pop شد به سراغ کاراکتر بعدی می رویم
    -اولویت ضرب و تقسیم از جمع و منها بیشتر است
    -اولویت دو عملگر یکسان مانند -+،++،--،-+،*/،//،**،*/ کمتر است یعنی مثلا + روی - یا + قرار نمی گیرد
    اگر تابع عملگر را بصورت( Eval(OP1,OP2 فرض کنیم که OP1 عنصر ورودی و OP2 عنصر بالای پشته باشد آنرا می توانید به صورت زیر بنویسید

    Eval(OP1,OP2)=True If OP1<OP2
    Eval(OP1,OP2)=False If OP1>OP2
    Eval(OP1,OP2)=False If OP1=Op2
    Eval(')',OP)=False
    Eval(OP,'(')=True
    Eval(OP,')')=False
    تابع Eval در صورتی که True بود عملیات Pop انجام می شود تا زمانیکه False شود یا رشته تمام شود و در صورتی که False باشد عمل push انجام می شود
    دقت کنید که ) یا ( در پشته B درج نمی شود
    این الگوریتم راه حل بازگشتی ساده دیگری نیز دارد و همینطور شما می توانید به جای استفاده از پشته دوم رشته را از انتها در زمان پردازش چاپ کنید
    لطفا روش را بررسی کنید و اگر سوالی داشتید بپرسید (امیدوارم جایی اشتباه نکرده باشم :) )
    موفق باشید
    سلام!
    استاد گرامی! پرانتزها چی میشه؟!
    چون قراره جمله‌‌ای که پرانتز داره با رعایت اولویت بی پرانتز کنه دیگه!

  7. #7

    نقل قول: الگوریتم تبدیل عبارت میانوند به پیشوند

    سلام دوست من

    ممنون از راهنمایی خوبتون

    میشه یکم در مورد استفاده از پرانتز توضیح بدین ؟

    اولویت پرانتز ها چطوری هست و چطور کار می کند ؟

  8. #8

    نقل قول: الگوریتم تبدیل عبارت میانوند به پیشوند

    الگوریتم تبدیل پیشوند به میانوند

  9. #9

    نقل قول: الگوریتم تبدیل عبارت میانوند به پیشوند

    الگوریتم تبدیل پسوند به میانوند

  10. #10

    نقل قول: الگوریتم تبدیل عبارت میانوند به پیشوند

    الگوریتم تبدیل پسوند به میانوند

  11. #11

    نقل قول: الگوریتم تبدیل عبارت میانوند به پیشوند

    سلام من این برنامه رو از همین سایت گرفتم برای محاسبه عبارت عددی هست چرا جواب نمی ده کسی میدونه مشکل چیه
    #include<stdio.h>
    #include
    <conio.h>
    #define m 21
    struct stack{
    int mytop;
    float items[m];
    }
    void push(stack *s,char);
    void pop(stack *s,char *);
    void push(stack *s,float);
    void pop(stack *s,float *);
    int empty(stack *s);
    void popAndtest(stack *s,char *x,int *underflow);
    void topAndtest(stack *s,char *x,int *underflow);
    int isOperand(char);
    void convert(char[],char[]);
    int pred(char,char);
    int isDigit(char);
    float evaluate(char []);
    float operate(char,float,float);
    int main()
    {
    char infix[m],postfix[m];
    int i;
    clrscr();
    printf("enter an infix expression:");
    gets(infix);
    convert(infix,postfix);
    printf("Evaluation of expression is:%.2f",evaluate(postfix));
    printf("postfix expression is:");
    for(i=0;postfix[i];i++)
    printf("%c",postfix[i]);
    getch();
    return 0;
    }
    //*****************************
    void convert(char infix[],char postfix[])
    {
    char symbol,topsymbol;
    int underflow,i,j=0;
    stack s;
    s.mytop=-1;
    for(i=0;infix[i],i++)
    {
    symbol = infix[i];
    if(isOperand(symbol))
    postfix[j++] = symbol;
    elseif(symbol == '(')
    push(&s,symbol);
    elseif(symbol == ')')
    {
    pop(&s,&topsymbol);
    while(topsymbol != '(')
    {
    postfix[j++] = topsymbol;
    pop(&s,&topsymbol);
    }
    //end of while
    }
    //end of else if
    else
    {
    topAndtest(&s, &topsymbol, &underflow);
    //if op1 >op2 then true
    if(empty(&s)||(!pred(topsymbol,symbol)))
    push(&s,symbol);
    else
    {
    popAndtest(&s,&topsymbol,&underflow);
    while(pred(topsymbol,symbol) && !underflow)
    {
    postfix[j++] == topsymbol;
    popAndtest(&s,&topsymbol,&underflow);
    }
    push(&s,symbol);
    }
    //end of else
    }
    //end of else
    }
    //end of for
    while(!empty(&s))_
    {
    pop(&s,&topsymbol);
    postfix[j++]==topsymbol;
    }
    postfix[j] ='\o';
    }
    //************************************
    int isOperand(char symbol)
    {
    if(symbol >='0' && symbol <= '9')
    return 1;
    return 0;
    }
    //************************************
    void push(stack *s,char x)
    {
    s -> items[++(s -> mytop)]=x;
    }
    //************************************
    void pop(stack *s,char *x)
    {
    *x=s ->items[(s -> mytop)--];
    }
    //************************************
    void popAndtest(stack *s,char *x,int *underflow)
    {
    if(empty(s))
    *underflow=1;
    else
    {
    *x= s -> items[(s -> mytop)--];
    *underflow=0;
    }
    }
    //*************************************
    void topAndtest(stack *s,char *x,int *underflow)
    {
    if(empty(S))
    *underflow=1;
    else
    {
    *x=s -> items[s ->mytop];
    *underflow=0;
    }
    }
    //**************************************
    int empty(stack *s)
    {
    if(s -> mytop == -1)
    return 1;
    else
    return 0;
    }
    //**************************************
    int pred(char op1,char op2)
    {
    int i,p1,p2;
    /* ( + - * / % */
    staticchar op[] = {'(','+','-','*','/','%','\0'};
    staticint isp[] = {0,12,12,13,13,13};
    for(i=0;op[i];i++)
    if(op[i]==op1)
    {
    p1=i;
    break;
    }
    for(i=0;op[i];i++)
    if(op[i]==op2)
    {
    p=i;
    break;
    }
    if(isp[p1]> = isp[p2])
    return 1;
    return 0;
    }
    //********************************
    float evaluate(char postfix[])
    {
    float value,operand1,operand2;
    char symbol;
    stack s;
    s.mytop = -1;
    int i;
    for(i=0;postfix[i];i++)
    {
    symbol=postfix[i];
    if(isdigit(symbol))
    push(&s,(float)(symbol - '0'));
    else
    {
    pop(&s,&operand2);
    pop(&s,&operand1);
    value=operate(symbol,operand1,operand2);
    push(&s,value);
    }
    //end of else
    }
    //end of for
    pop(&s,&value);
    return value;
    }
    //***********************************
    int isdigit(char symbol)
    {
    return (symbol >= '0' && symbol <= '9');
    }
    //***********************************
    float operate(char symbol, float operand1,float operand2)
    {
    switch(symbol)
    {
    case'+':
    return operand1 + operand2;
    case'-':
    return operand1 - operand2;
    case'*':
    return operand1 * operand2;
    case'/':
    return operand1 / operand2;
    case'%':
    return operand1 % operand2;
    }
    }
    //*************************************
    void push(stack *s,float x)
    {
    s -> items[++(s -> mytop)]=x;
    }
    //*************************************
    void pop(stack *s,float *x)
    {
    *x= s -> items[(s -> mytop)--];
    }

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •