PDA

View Full Version : infix to postfix & prefix



www.ilampro.com
چهارشنبه 13 آذر 1387, 14:40 عصر
سلام خدمت تمام دوستان
باز هم با زحمت اومدم. دوستان عزيز اگه ميشه ما رو در مورد تبديلات رشته هاي infix به
postfix و prefix ما رو راهنمايي كنيد

لیلا _1387
چهارشنبه 20 آذر 1387, 16:15 عصر
#ifndef STACK_H
#define STACK_H
template <class T>
class stack
{
public:
stack(int);
~stack();
int isEmpty();
void popAndTest(T&,int&);
void pushAndTest(T,int&);
void topAndTest(T&,int&);
void searchAndTest(T&,int&,int&,int&);
void display(); // for test stack
private:
int top,size;
T *items;
};
//***********
template <class T>
stack <T>::stack(int s)
{
size = s-1;
items = new T[size];
top = -1;
}
//***********
template <class T>
stack <T>::~stack()
{
delete []items;
}
//***********
template <class T>
int stack <T>::isEmpty()
{
return (top==-1);
}
//***********
template <class T>
void stack <T>::popAndTest(T &item,int &underflow)
{
if(isEmpty())
underflow = 1;
else
{
underflow = 0;
item = items[top--];
}
}
//***********
template <class T>
void stack <T>::pushAndTest(T item,int &overflow)
{
if(top==size)
overflow = 1;
else
{
overflow = 0;
items[++top] = item;
}
}
//***********
template <class T>
void stack <T>::topAndTest(T &item,int &underflow)
{
if(isEmpty())
underflow = 1;
else
{
underflow = 0;
item = items[top];
}
}
// Display stack items for test stack
template <class T>
void stack <T>::display()
{
register int i;
for(i=top;i>=0;i--)
cout << items[i] << "|";
}
//***********
template <class T>
void stack <T>::searchAndTest(T &item,int &underflow,int &find,int &place)
{
if(isEmpty())
underflow = 1;
else
{
register int i;
for(i=top;i>=0;i--)
if(items[i]==item)
{
find = 1;
place = i+1;
break;
}
}
}
#endif

لیلا _1387
چهارشنبه 20 آذر 1387, 16:17 عصر
in barname infix be prefix hastesh

لیلا _1387
چهارشنبه 20 آذر 1387, 16:18 عصر
#include "iostream.h"
#include "conio.h"
#define M 21
class stack {
public:
stack();
void push(char);
char pop();
int empty();
void popAndTest(char &, int &);
void topAndTest(char &, int &);
private:
int myTop;
char items[M];
};
//**************
stack::stack()
{
myTop = -1;
}
//**************
void stack::push(char x)
{
items[++myTop] = x;
}
//**************
char stack::pop()
{
return items[myTop--];
}
//**************
int stack::empty()
{
return (myTop == -1);
}
//**************
void stack::popAndTest(char &x, int &underflow)
{
if(empty())
underflow = 1;
else
{
x = items[myTop--];
underflow = 0;
}
}
//****************
void stack::topAndTest(char &x, int &underflow)
{
if(empty())
underflow = 1;
else
{
x = items[myTop];
underflow = 0;
}
}
//**************
int isOperand(char);
void convert(char[], char[]);
int pred(char, char);
int main()
{
char infix[M], postfix[M];
clrscr();
cout << "Enter an infix expression:";
cin.get(infix, M);
convert(infix, postfix);
cout << "Postfix expression is:";
for(int i = 0; postfix[i]; i++)
cout << postfix[i] << " ";
getch();
return 0;
}
//*****************
void convert(char infix[], char postfix[])
{
char symbol, topSymbol;
int underflow, j = 0;
stack s;
for(int i = 0; infix[i]; i ++)
{
symbol = infix[i];
if(isOperand(symbol))
postfix[j++] = symbol;
else if(symbol == '(')
s.push(symbol);
else if(symbol == ')')
{
topSymbol = s.pop();
while(topSymbol != '(')
{
postfix[j++] = topSymbol;
topSymbol = s.pop();
}//end of while
} //end of else if
else
{
s.topAndTest(topSymbol, underflow);
//if op1 > op2 then true
if(s.empty() || (!pred(topSymbol, symbol)))
s.push(symbol);
else
{
s.popAndTest(topSymbol, underflow);
while(pred(topSymbol, symbol) && !underflow)
{
postfix[j++] = topSymbol;
s.popAndTest(topSymbol, underflow);
}
s.push(symbol);
} //end of else
}//end of else
}//end of for
while(!s.empty())
{
topSymbol = s.pop();
postfix[j++] = topSymbol;
}
postfix[j] = '\0';
}
//*****************
int isOperand(char symbol)
{
if(symbol >= '0' && symbol <= '9')
return 1;
return 0;
}
//****************
int pred(char op1, char op2)
{
int i, p1, p2;
/* ( + - * / % */
static char op[] = {'(','+', '-', '*', '/','%','\0'};
static int 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)
{
p2 = i;
break;
}
if(isp[p1] >= isp[p2])
return 1;
return 0;
}

www.ilampro.com
پنج شنبه 21 آذر 1387, 17:03 عصر
سلام دوست عزیز
دست شما درد نکنه . دمت گرم
موفق باشی