PDA

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



z.rezaie
شنبه 23 خرداد 1394, 16:04 عصر
سلام من دنبال کد تبدیل عبارت میانوندی به پسوندی میگردم که با استفاده از پشته این کارو کنه کسی میتونه کمکم کنه؟

-Geek-
شنبه 23 خرداد 1394, 23:35 عصر
بهتر نیست یک جستجو هم انجام بدید؟ مثال و کد توی اینترنت زیاده.
متاسفانه با توجه به قوانین نمیتونم سوالتون رو حل کنم.
ولی اگر توی نوشتنش به راهنمایی نیاز داری بگو تا راهنمایی کنیم.

pbm_soy
یک شنبه 24 خرداد 1394, 00:47 صبح
تو اینترنت تا دلت بخواد کد و سورس این برنامه هست!!!

شایدم گشتید و حتی پیدا هم کردید ولی نمیتونید اجراش کنید! ویا خطا میده!
البته ما هم اینجا سورس را برای شما بذاریم همین قضیه خواهد شد!
حالا مشکل شما چیست؟
گشتید و پیدا نکردید؟
گشتید و پیدا کردید ولی در اجرا مشکل دارید؟

البته یک مورد دیگه را هم باید بگم اونم اینه که این برنامه در کتابهای ساختمان داده ها نوشته شده است در برخی کتابها سورس کامل و در برخی دیگر سورس توابع اصلیش هست فقط شما آن توابع را در یک برنامه باید بنویسید و یک main مناسب براش بذارید

pbm_soy
یک شنبه 24 خرداد 1394, 01:49 صبح
خواستم یک سورس بذارم ولی بازم دلم نیامد

شاید بلد نیستید سرچ کنید! (البته کسی که در این حد میخواهد برنامه نویسی کند باید سرچ کردن را بلد باشد)
من تو گوگل ساده نوشتم infix to postfix source4 code in c جوابهای زیر را داد

در این کد از Stack. استفاده کرده ولی خود Stack را پیاده سازی نکرده و از کلاس Stack خود C++ استفاده کرده است اگه اول کد را ببینید Stack.h را هم includeکرده است
http://stackoverflow.com/questions/3848468/infix-to-postfix


اینم یک کد کوتاه و چیزی که میخواهید
http://www.c4learn.com/data-structure/c-program-convert-infix-expression-to-postfix-using-stack/
چندتا لینک دیگه
http://www.c-program-example.com/2011/10/c-program-for-infix-to-postfix.html
http://electrofriends.com/source-codes/software-programs/c/data-structures-c/c-program-for-infix-to-postfix-conversion/
از این دست لینکها فوق العاده زیاد است لطفا سرچ کنید

camelia.ji
پنج شنبه 09 دی 1395, 15:23 عصر
سلام روز بخیر من ی سورس برای تبدیل عبارت میانوندی ب پسوندی گرفتم و تقریبا متوجه شدم چی گفته ی چندتا ارور هم داشت ک تونستم اصلاحشون کنم اما عبارت پسوندی رو چاپ نمیکنه می تونین راهنماییم کنین؟:ناراحت:
#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;
}
}