[英]Infix to Prefix and Postfix conversion
我正在编写代码以同时将中缀表达式转换为后缀和前缀。
我的问题是我无法转换为前缀表达式。 在我的 intoprefix() 中,我尝试了所有方法,但 output 仍然与后缀相同。
如果我在哪里输入这个表达式
A+B
预期的 output 将是
Postfix expression is: AB+
Prefix expression is: +AB
但我的 output 是
Postfix expression is: AB+
Prefix expression is: AB+AB+
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Stack{
char data;
struct Stack *next;
}*top = NULL, *pstart = NULL;
char str[50];
int main(int argc, char **argv){
printf("Enter infix expression: ");
gets(str);
printf("\n\nEquivalent postfix expression is: ");
intopostfix(str);
printf("\n\nEquivalent prefix expression is: ");
intoprefix(str);
printf("\n");
return 0;
}
/* function for insert operation */
void insert(char ch){
struct Stack *ptr,*newNode;
newNode = (struct Stack *)malloc(sizeof(struct Stack));
newNode->next = NULL;
newNode->data = ch;
ptr = pstart;
if(pstart == NULL){
pstart = newNode;
}
else{
while(ptr->next != NULL)
ptr = ptr->next;
ptr->next = newNode;
}
}
/* function for push operation */
void push(char symbol){
struct Stack *ptr;
ptr = (struct Stack *)malloc(sizeof(struct Stack));
ptr->data = symbol;
if(top == NULL){
top = ptr;
ptr->next = NULL;
}
else{
ptr->next = top;
top = ptr;
}
}
char pop(){
struct Stack *ptr1;
char ch1;
if(top == NULL){
printf("Stack underflow\n");
return 0;
}
else{
ptr1 = top;
top = top->next;
ch1 = ptr1->data;
free(ptr1);
ptr1 = NULL;
return ch1;
}
}
/* function for display display operation */
void displaypost(){
struct Stack *temp;
if(pstart == NULL)
printf("");
else{
temp = pstart;
while(temp != NULL){
printf("%c",temp->data);
temp = temp->next;
}
}
}
/*function for precedence */
int precedence(char ch){
if(ch == '^'){
return (5);
}
else if(ch == '*' || ch == '/'){
return (4);
}
else if(ch == '+' || ch == '-'){
return (3);
}
else{
return (2);
}
}
/*function for converting infix to postfix */
void intopostfix(char str[]){
int length;
int index = 0;
char symbol, temp;
length = strlen(str);
while(length > index)
{
symbol = str[index];
switch(symbol){
case '(':
push(symbol);
break;
case ')':
temp = pop();
while(temp != '('){
insert(temp);
temp = pop();
}
break;
case '^':
case '+':
case '-':
case '*':
case '/':
if(top == NULL){
push(symbol);
}
else{
while(top != NULL && (precedence(top->data) >= precedence(symbol))){
temp = pop();
insert(temp);
}
push(symbol);
}
break;
default:
insert(symbol);
}
index = index + 1;
}
while(top != NULL){
temp = pop();
insert(temp);
}
displaypost();
return;
}
/*function to convert infix to prefix */
void intoprefix(char str[]){
int length;
int index = 0;
char symbol, temp;
length = strlen(str);
while(length > index)
{
symbol = str[index];
switch(symbol){
case ')':
temp = pop();
break;
case '(':
push(symbol);
while(temp != ')'){
insert(temp);
temp = pop();
}
break;
case '+':
case '-':
case '*':
case '/':
case '^':
if(top == NULL){
push(symbol);
}
else{
while(top != NULL && (precedence(top->data) <= precedence(symbol))){
temp = pop();
insert(temp);
}
push(symbol);
}
break;
default:
insert(symbol);
}
index = index + 1;
}
while(top != NULL){
temp = pop();
insert(temp);
}
displaypost();
return;
}
该程序使用链表(堆栈)将中缀转换为后缀和前缀
以下是我的观察和修正:
gets
的警告。 已使用fgets
代替。 gets
是危险的,因为它可能导致缓冲区溢出。insert
function 中分配的存储空间。当调用intoprefix
时,这些位置的存在导致结果重复。 由于您已经有一个intopostfix
function,因此我使用以下算法将中infix
转换为prefix
。 请参考。
步骤 1:反转中缀表达式。 请注意,在反转每个 '(' 将变为 ')' 并且每个 ')' 变为 '('。
第二步:获取修改后的表达式的后缀表达式。
第三步:反转后缀表达式。
main
是存储输入和结果的 arrays 的所有者,从而避免使用“全局变量”并要求我显式传递这些变量。
从displaypost
中删除了显示柱intopostfix
并从main
调用它。
void insert(char ch);//no changes made void push(char symbol); //no changes made char pop(); //no changes made void displaypost(char * s); int precedence(char ch); //no changes made void intopostfix(char str[]); //removed the call to displaypost int main(int argc, char **argv){ char str[50]; char prefix_str[50];//store postfix str char postfix_str[50];//store prefix str printf("Enter infix expression: "); fgets(str,50,stdin); str[strlen(str)-1] = '\0';//overwrite newline char with NULL //reverse the original string and store in prefix_str int i,j; for(i = strlen(str)-1,j = 0;i >= 0;i--,j++){ if(str[i] == '(') prefix_str[j] = ')'; else if(str[i] == ')') prefix_str[j] = '('; else prefix_str[j] = str[i]; } prefix_str[j] = '\0'; //Print Post Fix printf("\n\nEquivalent postfix expression is: "); intopostfix(str); displaypost(postfix_str); printf("%s",postfix_str); //Print Prefix intopostfix(prefix_str); displaypost(prefix_str); //reverse prefix_str int temp; for(i = 0,j = strlen(prefix_str)-1;i < j;i++,j--){ temp = prefix_str[i]; prefix_str[i] = prefix_str[j]; prefix_str[j] = temp; } printf("\n\nEquivalent prefix expression is: "); printf("%s\n",prefix_str); printf("\n"); return 0; } //changes in displaypost void displaypost(char * s){ struct Stack *temp,*p; if(pstart == NULL) printf(""); else{ temp = pstart; int i = 0; while(temp;= NULL){ p = temp; s[i] = temp->data;//store character in array temp = temp->next; free(p);//free storage i++; } s[i] = '\0'; } pstart = NULL; }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.