PDA

View Full Version : آموزش: تبدیل Postfix به Infix



Mahmoud.Afrad
پنج شنبه 28 اردیبهشت 1391, 08:59 صبح
سلام
تبدیل عبارت PostFix به Infix
این تبدیل توسط یک پشته باید انجام بشه. به این صورت که با پردازش عبارت postfix از چپ به راست و با کمک پشته میتونیم به نتیجه برسیم. اگر سر پشته operand (مقدار) بود از رشته میخوانیم و در پشته قرار میدیم تا به یک operator (علامت) برسیم که در این صورت اون علامت رو روی دو operand سر پشته اعمال کرده (دو operand از سر پشته حذف میشن) و نتیجه رو به عنوان یک operand داخل پشته میزاریم. زمانی که به انتهای رشته رسیدیم و پشته دارای یک عنصر بود عبارت infix همان عنصر درون پشته است. اگر در طول پردازش عبارت به جایی برسیم که رشته را کامل پردازش کردیم ولی بیش از دو عنصر در پشته بود عبارت اولیه اعتبار نداره و postfix نیست.
مثال: میخواهیم عبارت

ABC-D*+
رو به infix تبدیل کنیم.
1- خوب از سر رشته میخونیم و در پشته میزاریم تا به یک علامت برسیم. A,B,C میرن داخل پشته:


پشته
C
B
A

2- منها (-) یک عملگر هست پس دوتا عنصر از پشته میخونیم و عملگر رو روی اونها اعمال کرده نتیجه در پشته قرار میگره


پشته
B-C
A

3- D میره تو پشته


پشته
D
B-C
A

4- به عملگر ضرب (*) میرسیم دو عنصر سر پشته رو میخونیم و ضرب رو روشون اعمال میکنیم و نتیج رو داخل پشته میزاریم


پشته
(B-C)*D
A

5- عملگر جمع رو روی دو عنصر سر پشته اعمال کرده نتیجه داخل پشته:


پشته
A+(B-C)*D

6- به انتهای عبارت رسیدیم و فقط یک عنصر در پشته هست پس عبارت اولیه postfix است و عنصر درون پشته معادل Infix آن.




این هم کدهای برنامه:

Stack<string> stk = new Stack<string>();
bool flag;

private void button1_Click(object sender, EventArgs e)
{
stk.Clear();
flag = true;
string s = textBox1.Text.Trim();
textBox2.Clear();

if (s != string.Empty)
{
for (int i = 0; i < s.Length; i++)
{
p(s[i]);
if (flag == false)
break;
}

if (stk.Count != 1)
flag = false;


if (flag == true)
{
textBox2.BackColor = Color.GreenYellow;
textBox2.ForeColor = Color.Black;
textBox2.Text = stk.Pop();
}
else
{
textBox2.BackColor = Color.Yellow;
textBox2.ForeColor = Color.Red;
textBox2.Text = "The input is not Postfix";
}
}
else
{
textBox2.BackColor = Color.Yellow;
textBox2.ForeColor = Color.Red;
textBox2.Text = "Please Input The Postfix";
}
}

private void p(char ch)
{
if (ch == '+' || ch == '-' || ch == '*' || ch == '/')
{
if (stk.Count >= 2)
{
string t2 = stk.Pop();
string t1 = stk.Pop();
stk.Push("(" + t1 + ch + t2 + ")");
}
else if (stk.Count < 2)
{
flag = false;
return;
}
}
else
{
stk.Push(Convert.ToString(ch));
}
}

eelyar
پنج شنبه 16 خرداد 1392, 14:33 عصر
man ino tu c++ zadam eror dad????????

daniyaltjm
شنبه 13 شهریور 1395, 16:35 عصر
حالا اگه بخوایم مقدار کل عبارت رو نمایش بده چی؟