-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathprefix_to_infix.c
More file actions
139 lines (116 loc) · 3.56 KB
/
Copy pathprefix_to_infix.c
File metadata and controls
139 lines (116 loc) · 3.56 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
/*
* Program: Prefix to Infix Conversion
* Description: Converts prefix expression to infix notation using string stack
* Author: Amey Thakur
* Reference: https://github.com/Amey-Thakur/DATA-STRUCTURES-AND-DATA-STRUCTURES-LAB
*/
#include <stdio.h>
#include <string.h>
#define MAX 30
// Global stack for strings
char stack[MAX][MAX];
int top = -1;
// Function prototypes
void push(char str[]);
void pop(char str[]);
int isOperator(char ch);
void prefixToInfix(char prefix[], char infix[]);
int main() {
// Example: +-*^ABCD//EF+GH means A^B*C-D+E/F/G+H
char prefix[MAX] = "+-*^ABCD//EF+GH";
char infix[MAX];
printf("=== Prefix to Infix Converter ===\n\n");
printf("Operators supported: + - * / ^\n");
printf("Example: +AB means A+B\n");
printf("Example: *+ABC means (A+B)*C\n\n");
// Convert to infix
prefixToInfix(prefix, infix);
printf("Input Prefix Expression: %s\n", prefix);
printf("Output Infix Expression: %s\n", infix);
return 0;
}
/*
* Function: push
* Description: Pushes a string onto the stack
* Parameters: str - String to push
*/
void push(char str[]) {
if (top < MAX - 1) {
strcpy(stack[++top], str);
} else {
printf("Stack overflow: May be invalid prefix expression\n");
}
}
/*
* Function: pop
* Description: Pops and returns top string from stack
* Parameters: str - Buffer to store popped string
*/
void pop(char str[]) {
if (top >= 0) {
strcpy(str, stack[top--]);
} else {
printf("Stack underflow: May be invalid prefix expression\n");
}
}
/*
* Function: isOperator
* Description: Checks if character is an operator
* Parameters: ch - Character to check
* Returns: 1 if operator, 0 otherwise
*/
int isOperator(char ch) {
return (ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '^');
}
/*
* Function: prefixToInfix
* Description: Converts prefix expression to infix notation
* Parameters:
* prefix - Input prefix expression
* infix - Output infix expression
* Algorithm:
* - Scan prefix from RIGHT to LEFT
* - If operand, push to stack
* - If operator, pop two operands, combine as (operand1 operator operand2), push back
*/
void prefixToInfix(char prefix[], char infix[]) {
char op[2]; // Operator string
char popped1[MAX]; // First popped operand
char popped2[MAX]; // Second popped operand
char temp[MAX]; // Temporary string for combination
int i = strlen(prefix);
op[1] = '\0'; // Null terminate operator string
printf("--- Conversion Process ---\n");
printf("Scanning from right to left...\n");
// Scan from right to left
while (--i != -1) {
// Skip spaces
if (prefix[i] == ' ') {
continue;
}
// If operator
if (isOperator(prefix[i])) {
// Pop two operands
pop(popped1);
pop(popped2);
// Create infix: (popped1 operator popped2)
op[0] = prefix[i]; // Operator
strcpy(temp, "(");
strcat(temp, popped1);
strcat(temp, op);
strcat(temp, popped2);
strcat(temp, ")");
printf("Combined: %s\n", temp);
// Push result back to stack
push(temp);
}
// If operand
else {
op[0] = prefix[i]; // Operand
push(op);
printf("Pushed operand: %c\n", prefix[i]);
}
}
// Final result is on stack
pop(infix);
}