mirror of
https://github.moeyy.xyz/https://github.com/TheAlgorithms/C.git
synced 2023-10-11 15:56:24 +08:00
Create Infix to Postfix Conversion using stacks
Application of stacks
This commit is contained in:
parent
e5dad3fa8d
commit
f505beb2f4
115
data_structures/stack/Infix to Postfix Conversion using stacks
Normal file
115
data_structures/stack/Infix to Postfix Conversion using stacks
Normal file
@ -0,0 +1,115 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
struct stack
|
||||||
|
{
|
||||||
|
int size;
|
||||||
|
int top;
|
||||||
|
char *arr;
|
||||||
|
};
|
||||||
|
|
||||||
|
int stackTop(struct stack* sp){
|
||||||
|
return sp->arr[sp->top];
|
||||||
|
}
|
||||||
|
|
||||||
|
int isEmpty(struct stack *ptr)
|
||||||
|
{
|
||||||
|
if (ptr->top == -1)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int isFull(struct stack *ptr)
|
||||||
|
{
|
||||||
|
if (ptr->top == ptr->size - 1)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void push(struct stack* ptr, char val){
|
||||||
|
if(isFull(ptr)){
|
||||||
|
printf("Stack Overflow! Cannot push %d to the stack\n", val);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
ptr->top++;
|
||||||
|
ptr->arr[ptr->top] = val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
char pop(struct stack* ptr){
|
||||||
|
if(isEmpty(ptr)){
|
||||||
|
printf("Stack Underflow! Cannot pop from the stack\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
char val = ptr->arr[ptr->top];
|
||||||
|
ptr->top--;
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int precedence(char ch){
|
||||||
|
if(ch == '*' || ch=='/')
|
||||||
|
return 3;
|
||||||
|
else if(ch == '+' || ch=='-')
|
||||||
|
return 2;
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int isOperator(char ch){
|
||||||
|
if(ch=='+' || ch=='-' ||ch=='*' || ch=='/')
|
||||||
|
return 1;
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
char* infixToPostfix(char* infix){
|
||||||
|
struct stack * sp = (struct stack *) malloc(sizeof(struct stack));
|
||||||
|
sp->size = 10;
|
||||||
|
sp->top = -1;
|
||||||
|
sp->arr = (char *) malloc(sp->size * sizeof(char));
|
||||||
|
char * postfix = (char *) malloc((strlen(infix)+1) * sizeof(char));
|
||||||
|
int i=0; // Track infix traversal
|
||||||
|
int j = 0; // Track postfix addition
|
||||||
|
while (infix[i]!='\0')
|
||||||
|
{
|
||||||
|
if(!isOperator(infix[i])){
|
||||||
|
postfix[j] = infix[i];
|
||||||
|
j++;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
if(precedence(infix[i])> precedence(stackTop(sp))){
|
||||||
|
push(sp, infix[i]);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
postfix[j] = pop(sp);
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (!isEmpty(sp))
|
||||||
|
{
|
||||||
|
postfix[j] = pop(sp);
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
postfix[j] = '\0';
|
||||||
|
return postfix;
|
||||||
|
}
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
char * infix = "x-y/z-k*d";
|
||||||
|
printf("postfix is %s", infixToPostfix(infix));
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user