تبدیل عبارت میانوندی به پسوندی
سلام روز بخیر من ی سورس برای تبدیل عبارت میانوندی ب پسوندی گرفتم و تقریبا متوجه شدم چی گفته ی چندتا ارور هم داشت ک تونستم اصلاحشون کنم اما عبارت پسوندی رو چاپ نمیکنه می تونین راهنماییم کنین؟
#include "stdafx.h"//این دستور معمولا توسط نرم افزار ویژال استدیو نوشته می شود و در واقع کتابخانه ای که برای اجرای برنامه لازم هست را به برنامه اضافه می کند
#include<iostream>// این کتابخانه برای چاپ اطلاعات در خروجی استفاده می گردد. در خط پایینی یک namespace معرفی شده است.
#include<stdio.h>// اجازه دسترسی به هدرهای io استاندارد کتابخانه استاندارد و هدر کار با رشته ها و تعریف نوع رشته ای را می دهند.
//#include<conio.h>وجودش لازم نیست*** یک هدرفایل غیراستاندارد سی است که بیشتر در کامپایلرهای اماس-داس برای فراهمکردن امکانات ورودی/خروجی در کنسول استفاده شدهاست. conio.h جزء هیچ یک از کتابخانه استاندارد سی، آنسی سی و پازیکس نیست.
#include<string.h>// اجازه دسترسی به هدرهای io استاندارد کتابخانه استاندارد و هدر کار با رشته ها و تعریف نوع رشته ای را می دهند.
using namespace std;//رخی از دستورات سی پلاس پلاس دارای namespace هستند. مثلا اگر ما این خط را ننوشته باشیم باید در زمان استفاده از دستور cout از این روش استفاده کنیم. std.cout که برای کوتاه تر شدن برنامه ها در ابتدای برنامه این namespace را به برنامه اعلام می نماییم.
class stack//تعریف کلاسی برای پشته
{
int top;//عنصر بالایی در پشته ک با استفاده ازش می تونیم عملیات حذف و اضافه و ... رو داشته باشیم
char *starry;//اشاره گری به پشته برای دسترسی به پشته
int size;//اندازه ارایه
public://قسمت عمومی کلاس پشته ک در اون تابع سازنده و حذف و اضافه کردن و همچنین تابع پر بودن نوشته شده
stack(int);//تابع سازنده
char pop();//حذف کردن
char maxposhte();
void push(char ch);//اضافه کردن
};
stack::stack(int s){
size = s;
top = -1;//یعنی پشته هست اما خالیه
starry = new char(size);//تعریف حافظه پویا برای پشته
}
char stack::pop()//تابع popمخصوص حذف از پشته از کلاس پشته
{
char ret;
if (top != -1)//همون کار تابع isempity رو انجام میده میگه ا/ه تاپ مخالف منفی یک باشه یعنی تو پشته ی عنصری باشهاون عنصرر رو در متغییر رت ذخیره کن و تاپ رو یدونه کم کن و رت رو برگردون ب تابع پاپ یعنی رت رو حذف کن
{
ret = starry[top];
top--;
return ret;
}
else//اگر پته خالی بود یعنی تاپ منفی یک شد شارپ رو برگردون
return '#';
}
void stack::push(char ch)//تابعی برای اضافه کردن عنصر
{
if (top != size - 1)//اینکه بفهمیم پشته پر نیست و میشه ی عنصر جدید اضاف کرد ک می توانستیم یک تابع isfullبنویسیم ک ب این شکل هم مشکلی نداره.
{
top++;// تاپ هم یکی بیتر میکنیم
starry[top] = ch;//پشته پر نیست پس این عنصر جدید رد ب عنوان تاپ ذخیره میکنیم
}
}
char stack::maxposhte()
{
char ch;
if (top != -1)
ch = starry[top];
else
ch = '#';
return ch;
}
const int size = 50;
char mianvand[size], pasvand[size];
int arzesh(char ch);
int main()
{
for (;;)
{
stack kk(50);
system("cls");//برای پاک کردن صفحه کنسولی گذاشتمش اگه اینو نمینوشتم پشت سر هم بعد ی بار اجرا مینوشت عبارت میانوندی را وارد کنید
cout << "\n\n\n\t\t\tebarete mianvandi ra vared konid :" << "\n\n\n\t\t\t\t\t";
char x, y;
int prep, pre, j = 0, chk = 0;
char popped;
char*gets(mianvand);//می خوایم ارایه بگیریم از این دستور استفاده می کنیم و ارایه میانوندی رو میگیریم ک از جنس کاراکتر و اشاره گره
for (int i = 0; mianvand[i] != 0; i++)
{
if (mianvand[i] != '('&&mianvand[i] != ')'&&mianvand[i] != '^'&&mianvand[i] != '*'&&mianvand[i] != '/'&&mianvand[i] != '+'&&mianvand[i] != '-')
{
pasvand[j] = mianvand[i];//در اینجا اگر عبارتی وارد شود ک مخالف اپریتور های بالا باشد اوپرندش در خروجی چاپ می شود
j++;
}
else if (mianvand[i] == '(')//در غیر این صورت اگر پرانتز باز, بودعبارت در پشته اضافه بشه
{
y = mianvand[i];
kk.push(y);
}
else if (mianvand[i] == ')')//اگر پرانتز بسته بود اون عبارت در عنصری ذخیره بشه و
{
popped = kk.pop();
while (popped != '(')
{
pasvand[j] = popped;
j++;
popped = kk.pop();
}
}
else//در غیر این صورت عبارت در وای ذخیره بشه و ارزش عبارت در پری ذخیره بشهو عبارتی ک در پشته قرار داره تابع ماکس پشته رو براش فراخونی کنیدو ارزش عنصر ک توی شته است در پریپ ذخیره بشه
{
y = mianvand[i];
pre = arzesh(y);
x = kk.maxposhte();
prep = arzesh(x);
if (pre > prep)//اگر ارزش عبارتی ک می خوادوارد پشته بشه بیشتر باشهاون رو اضافه کن
kk.push(y);
else//در غیر این صورت یعنی اگه ارزش عبارت ک می خواد وارد پشته بشه کمتر مساوی عبارت داخل پشته بود
{
while (prep >= pre)
{
if (x == '#')//اگر داخل پشته #بود از وایل خارج بشو
break;
popped = kk.pop();// و*اما اگه عبارتی در پشته وجود داشت با شرط فوقاون عنصر و از پشته حذف کن
x = kk.maxposhte();//ماکس پشته رو ب عنصر دیگه میده
pasvand[j] = popped;//*و در عبارت پسوندی ذخیره اش کن
j++;
prep = arzesh(x);//ارزش عنصری ک ماکس پشته شد مجددا در چری ذخیره میشه و دوباره برسی میشه وایل
}
kk.push(y);//در انتحا عنصر اخر ب پشته اضافه میشه
}
}
}
while ((popped = kk.pop()) != '#')//اگر عنصری ک از پشته حذف کردیم مخالف#باشه تو پسوندی ببرش و جی ی دونه اضافه بشه
{
pasvand[j] = popped;
j++;
}
cout << "\n\n\n\t\t\t\t\t ";
for (int i = 0; pasvand[i]; i++)//عبارت پسوندی چاپ بشه
{
if (pasvand[i] != '(')
cout << pasvand[i];
}
cin.get();
}
}
int arzesh(char ch)
{
switch (ch)
{
case '^': return 5;
case '/': return 4;
case '*': return 4;
case '+': return 3;
case '-': return 3;
default: return 0;
}
}

پاسخ ها ( 1 )
سلام
تکه کد زیر هم مربوط به عملیات تبدیل عبارت میانوندی به پیشوندی است:
// 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; } }موفق باشید
ممنون از جوابتون اما من متوجه مشکل برنامه تبدیل عبارت پسوندی نمی شم می خوام با دستور coutعبارت رو نشون بدم اما نمیدونم مشکل چیه ک عبارت پسوندی رو نشون نمیده اگه بلدین ممنون میشم راهنمایی کنید
متاسفانه با زبان C آشنایی زیاد ندارم