Q: Write a program to demonstrate the use of stack in converting arithmetic
expression from infix notation to postfix notation.
PROGRAM: -
#include<iostream>
#include <string.h>
#include <stdlib.h>using namespace std;struct Stack
{
int
top;
unsigned
capacity;
int*
array;
};
struct Stack* createStack( unsigned
capacity )
{
struct
Stack* stack = (struct Stack*) malloc(sizeof(struct Stack));
if
(!stack)
return
NULL;
stack->top
= -1;
stack->capacity
= capacity;
stack->array
= (int*) malloc(stack->capacity * sizeof(int));
if
(!stack->array)
return
NULL;
return
stack;
}
int isEmpty(struct Stack* stack)
{
return
stack->top == -1 ;
}
char peek(struct Stack* stack)
{
return
stack->array[stack->top];
}
char pop(struct Stack* stack)
{
if
(!isEmpty(stack))
return
stack->array[stack->top--] ;
return
'$';
}
void push(struct Stack* stack, char op)
{
stack->array[++stack->top]
= op;
}
int isOperand(char ch)
{
return
(ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <=
'Z');
}
int Prec(char ch)
{
switch
(ch)
{
case
'+':
case
'-':
return
1;
case
'*':
case
'/':
return
2;
case
'^':
return
3;
}
return
-1;
}
int infixToPostfix(char* exp)
{
int
i, k;
struct
Stack* stack = createStack(strlen(exp));
if(!stack) return
-1 ;
for
(i = 0, k = -1; exp[i]; ++i)
{
if
(isOperand(exp[i]))
exp[++k]
= exp[i];
else
if (exp[i] == '(')
push(stack,
exp[i]);
else
if (exp[i] == ')')
{
while
(!isEmpty(stack) && peek(stack) != '(')
exp[++k]
= pop(stack);
if
(!isEmpty(stack) && peek(stack) != '(')
return
-1;
else pop(stack);
}
else {
while
(!isEmpty(stack) && Prec(exp[i]) <= Prec(peek(stack)))
exp[++k]
= pop(stack);
push(stack,
exp[i]);
}
}
while
(!isEmpty(stack))
exp[++k]
= pop(stack );
exp[++k]
= '\0';
cout<<"\npostfix
is :-\n"<<exp;
}
int main()
{ cout<<"Infix
is :- \na+b*(c^d-e)^(f+g*h)-i\n"; char
exp[] = "a+b*(c^d-e)^(f+g*h)-i"; infixToPostfix(exp);
return
0;
}
OUTPUT:
No comments:
Post a Comment