دریافت عبارت میانوندی به پسوندی وپیشوندی ومحاسبه ان
ارسال شده: چهارشنبه ۲۲ دی ۱۳۸۹, ۹:۴۶ ق.ظ
سلام من این برنامه رو نوشتم فقط تست اینکه تعداد پرانتزها درسته یا نه و ورود اعداد یا عبارت بیشتر از یکی رقم مثلا(65*91) باید درسته بشه خیلی ممنون میشم تا شب بهم خبر بدین
stacklibrary;
namespace postfix
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
char[] postfix;
char[] prefix;
object topsymbol = "";
int size;
int len;
int d = 0;
//***********************************************************************
int oprate(int a, int b, char symbol)
{
if (symbol == '-')
d = a - b;
if (symbol == '+')
d = a + b;
if (symbol == '*')
d = a * b;
if (symbol == '/')
d = a / b;
if (symbol == '^')
d =Convert.ToInt32 (Math .Pow(a, b));
return d;
}
//***********************************************************************
bool isoperand(char symbol)
{
if ((symbol >= 'a' && symbol<= 'z') ||( symbol >= 'A' && symbol<= 'Z')||(symbol>='0' && symbol<='9'))
return true;
return false;
}
//************************************************************************
bool isoperator(char symbol)
{
if ( symbol == '+' || symbol == '-' || symbol == '/' || symbol == '*')
return true;
return false;
}
//*************************************************************************
bool pred(char op1, char op2)
{
int i, p1=0, p2=0;
char[] op ={ '(', '+', '-', '*', '/', '\0' };
int[] iop ={ 0, 10, 10, 20, 20, 20 };
for (i = 0; op[i] != '\0'; i++)
if (op[i] == op1)
{
p1 = i;
break;
}
for (i = 0; op[i] != '\0'; i++)
if (op[i] == op2)
{
p2 = i;
break;
}
if (iop[p1] > iop[p2])
return true;
return false;
}
//*************************************************************************
void convert(char[] infix, char[] postfix,out int size)
{
stack s = new stack();
char symbol;
object topsymbol="";
int j=0;
bool underflow;
for (int i = 0; i < len; i++)
{
symbol = infix[i];
if (symbol == '(')
s.push(symbol);
else if (isoperand(symbol))
postfix[j++] = symbol;
else if (symbol == ')')
{
topsymbol = s.pop();
while (Convert.ToChar( topsymbol) != '(')
{
postfix[j++] = Convert.ToChar (topsymbol);
topsymbol = s.pop();
}
}
else
{
s.topandtest(ref topsymbol, out underflow);
if (s.isempty() || pred(symbol,Convert.ToChar( topsymbol)))
s.push(symbol);
else
{
s.popandtest(ref topsymbol, out underflow);
while (!pred(symbol,Convert.ToChar( topsymbol)) && !underflow)
{
postfix[j++] =Convert.ToChar ( topsymbol);
s.topandtest(ref topsymbol, out underflow);
}
s.push(symbol);
}
}
}
while(!s.isempty ())
postfix[j++]=Convert.ToChar( s.pop());
size = j;
}
//*************************************************************************
private void btnconvert_Click(object sender, EventArgs e)
{
len = txtinfix.Text.Length;
char[] infixe = new char[len];
postfix = new char[len];
txtinfix .Text .CopyTo(0,infixe,0,len);
convert(infixe, postfix, out size);
txtposfix.Text = "";
for (int i = 0; i < size; i++)
txtposfix.Text += postfix[i].ToString();
}
//*************************************************************************
private void btnmohasebeh_Click(object sender, EventArgs e)
{
stack s = new stack();
char symbol;
int op1, op2;
for (int i = 0; i < size; i++)
{
symbol=postfix[i];
if (isoperand(symbol))
s.push( symbol-'0');
else
{
op2=Convert.ToInt32( s.pop());
op1 = Convert.ToInt32(s.pop());
int v=oprate(op1,op2,symbol);
s.push(v);
}
}
int result=Convert.ToInt32( s.pop());
txtmohasebeh.Text = d.ToString();
}
//******************************************************
private void btnprefix_Click(object sender, EventArgs e)
{
len = txtinfix.Text.Length;
char[] infixe = new char[len];
prefix = new char[len];
txtinfix.Text.CopyTo(0, infixe, 0, len);
convert1(infixe, prefix, out size);
txtprefix.Text = "";
for (int m = 0; m < size; m++)
txtprefix.Text += prefix[m].ToString();
}
//**********************************************************
void convert1(char[] infix, char[] prefix, out int size)
{
int j = 0;
stack s1 = new stack();
stack s2 = new stack();
char symbol;
for (int i = len - 1; i >= 0; i--)
{
symbol = infix[i];
if (symbol == ')' )
s1.push(symbol);
if (isoperand(symbol))
s2.push(symbol);
else if (isoperator(symbol ))
{
while(s1.isempty() && pred (Convert.ToChar(s1.top()) , symbol))
s2.push(s1.pop());
s1.push(symbol);
}
else if (symbol == '(')
{
topsymbol = s1.pop();
while (Convert.ToChar(topsymbol) != ')')
{
s2.push(topsymbol);
topsymbol = s1.pop();
}
}
}
while (! s1.isempty())
s2.push(s1.pop());
while (!s2.isempty())
prefix[j++] = Convert.ToChar(s2.pop());
size = j;
}
}
}
//****************************************************
اینم کلاسم
namespace stackLibrary
{
public class stack
{
private const int size = 100;
private object[] items = new object[size];
private int topindex;
public stack()
{
topindex = -1;
}
//***************************insert***********
public void push(object x)
{
items[++topindex] = x;
}
//***************************delete***********
public object pop()
{
object x = items[topindex--];
return x;
}
//***************************retrive**********
public object top()
{
return items[topindex];
}
//***************************present**********
public void show(object[] a, out int len)
{
for (int i = 0; i <= topindex; i++)
{
a[i] = items[i];
}
len = topindex;
}
//***************************empty************
public bool isempty()
{
if (topindex == -1)
return true;
return false;
}
//***************************test&delete*******
public void popandtest(ref object x, out bool underflow)
{
if (isempty() == true)
underflow = true;
else
{
underflow = false;
x = items[topindex--];
}
}
//***************************test&retrive*******
public void topandtest(ref object x, out bool underflow)
{
if (topindex == -1)
underflow = true;
else
{
underflow = false;
x = items[topindex];
}
}
//***************************test&insert********
public void pushandtest(ref object x, out bool overflow)
{
if (topindex == size - 1)
overflow = true;
else
{
items[++topindex] = x;
overflow = false;
}
}
//***************************end************
}
}
stacklibrary;
namespace postfix
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
char[] postfix;
char[] prefix;
object topsymbol = "";
int size;
int len;
int d = 0;
//***********************************************************************
int oprate(int a, int b, char symbol)
{
if (symbol == '-')
d = a - b;
if (symbol == '+')
d = a + b;
if (symbol == '*')
d = a * b;
if (symbol == '/')
d = a / b;
if (symbol == '^')
d =Convert.ToInt32 (Math .Pow(a, b));
return d;
}
//***********************************************************************
bool isoperand(char symbol)
{
if ((symbol >= 'a' && symbol<= 'z') ||( symbol >= 'A' && symbol<= 'Z')||(symbol>='0' && symbol<='9'))
return true;
return false;
}
//************************************************************************
bool isoperator(char symbol)
{
if ( symbol == '+' || symbol == '-' || symbol == '/' || symbol == '*')
return true;
return false;
}
//*************************************************************************
bool pred(char op1, char op2)
{
int i, p1=0, p2=0;
char[] op ={ '(', '+', '-', '*', '/', '\0' };
int[] iop ={ 0, 10, 10, 20, 20, 20 };
for (i = 0; op[i] != '\0'; i++)
if (op[i] == op1)
{
p1 = i;
break;
}
for (i = 0; op[i] != '\0'; i++)
if (op[i] == op2)
{
p2 = i;
break;
}
if (iop[p1] > iop[p2])
return true;
return false;
}
//*************************************************************************
void convert(char[] infix, char[] postfix,out int size)
{
stack s = new stack();
char symbol;
object topsymbol="";
int j=0;
bool underflow;
for (int i = 0; i < len; i++)
{
symbol = infix[i];
if (symbol == '(')
s.push(symbol);
else if (isoperand(symbol))
postfix[j++] = symbol;
else if (symbol == ')')
{
topsymbol = s.pop();
while (Convert.ToChar( topsymbol) != '(')
{
postfix[j++] = Convert.ToChar (topsymbol);
topsymbol = s.pop();
}
}
else
{
s.topandtest(ref topsymbol, out underflow);
if (s.isempty() || pred(symbol,Convert.ToChar( topsymbol)))
s.push(symbol);
else
{
s.popandtest(ref topsymbol, out underflow);
while (!pred(symbol,Convert.ToChar( topsymbol)) && !underflow)
{
postfix[j++] =Convert.ToChar ( topsymbol);
s.topandtest(ref topsymbol, out underflow);
}
s.push(symbol);
}
}
}
while(!s.isempty ())
postfix[j++]=Convert.ToChar( s.pop());
size = j;
}
//*************************************************************************
private void btnconvert_Click(object sender, EventArgs e)
{
len = txtinfix.Text.Length;
char[] infixe = new char[len];
postfix = new char[len];
txtinfix .Text .CopyTo(0,infixe,0,len);
convert(infixe, postfix, out size);
txtposfix.Text = "";
for (int i = 0; i < size; i++)
txtposfix.Text += postfix[i].ToString();
}
//*************************************************************************
private void btnmohasebeh_Click(object sender, EventArgs e)
{
stack s = new stack();
char symbol;
int op1, op2;
for (int i = 0; i < size; i++)
{
symbol=postfix[i];
if (isoperand(symbol))
s.push( symbol-'0');
else
{
op2=Convert.ToInt32( s.pop());
op1 = Convert.ToInt32(s.pop());
int v=oprate(op1,op2,symbol);
s.push(v);
}
}
int result=Convert.ToInt32( s.pop());
txtmohasebeh.Text = d.ToString();
}
//******************************************************
private void btnprefix_Click(object sender, EventArgs e)
{
len = txtinfix.Text.Length;
char[] infixe = new char[len];
prefix = new char[len];
txtinfix.Text.CopyTo(0, infixe, 0, len);
convert1(infixe, prefix, out size);
txtprefix.Text = "";
for (int m = 0; m < size; m++)
txtprefix.Text += prefix[m].ToString();
}
//**********************************************************
void convert1(char[] infix, char[] prefix, out int size)
{
int j = 0;
stack s1 = new stack();
stack s2 = new stack();
char symbol;
for (int i = len - 1; i >= 0; i--)
{
symbol = infix[i];
if (symbol == ')' )
s1.push(symbol);
if (isoperand(symbol))
s2.push(symbol);
else if (isoperator(symbol ))
{
while(s1.isempty() && pred (Convert.ToChar(s1.top()) , symbol))
s2.push(s1.pop());
s1.push(symbol);
}
else if (symbol == '(')
{
topsymbol = s1.pop();
while (Convert.ToChar(topsymbol) != ')')
{
s2.push(topsymbol);
topsymbol = s1.pop();
}
}
}
while (! s1.isempty())
s2.push(s1.pop());
while (!s2.isempty())
prefix[j++] = Convert.ToChar(s2.pop());
size = j;
}
}
}
//****************************************************
اینم کلاسم
namespace stackLibrary
{
public class stack
{
private const int size = 100;
private object[] items = new object[size];
private int topindex;
public stack()
{
topindex = -1;
}
//***************************insert***********
public void push(object x)
{
items[++topindex] = x;
}
//***************************delete***********
public object pop()
{
object x = items[topindex--];
return x;
}
//***************************retrive**********
public object top()
{
return items[topindex];
}
//***************************present**********
public void show(object[] a, out int len)
{
for (int i = 0; i <= topindex; i++)
{
a[i] = items[i];
}
len = topindex;
}
//***************************empty************
public bool isempty()
{
if (topindex == -1)
return true;
return false;
}
//***************************test&delete*******
public void popandtest(ref object x, out bool underflow)
{
if (isempty() == true)
underflow = true;
else
{
underflow = false;
x = items[topindex--];
}
}
//***************************test&retrive*******
public void topandtest(ref object x, out bool underflow)
{
if (topindex == -1)
underflow = true;
else
{
underflow = false;
x = items[topindex];
}
}
//***************************test&insert********
public void pushandtest(ref object x, out bool overflow)
{
if (topindex == size - 1)
overflow = true;
else
{
items[++topindex] = x;
overflow = false;
}
}
//***************************end************
}
}