gpt4 book ai didi

c - 使用堆栈中缀到后缀

转载 作者:太空宇宙 更新时间:2023-11-03 23:31:06 25 4
gpt4 key购买 nike

我的讲师给我布置了一个作业,要求我创建一个程序,使用 Stack 将中缀表达式转换为后缀。我制作了堆栈类和一些函数来读取中缀表达式。

但是这个名为 inToPos(char string[]) 的函数正在创建一个断点,它负责使用堆栈将字符串 inFix 中的 inFix 表达式转换为字符串 postFix 中的后修复表达式。你们能帮帮我,告诉我我做错了什么吗?

这些是我的代码,急需您的帮助.. :)

#include<stdio.h>
#include<stdlib.h>
#define MAX 15
#define true 1
#define false 0

typedef struct node* nodeptr;

typedef struct node{
int data;
nodeptr next;
}Node;

typedef struct{
int count;
nodeptr top;
}Stack;
typedef Stack* StackList;

StackList create();
void display(StackList list);
int isEmpty(StackList list);
void push(StackList list, int item);
void pop(StackList list);

int inToPos(char string[]);
int isOperator(char string[], int i);
int precedence(char x);

StackList create(){
StackList list;
list=(StackList)malloc(sizeof(Stack));
list->count=0;
list->top=NULL;
return list;
}

void display(StackList list){
nodeptr ptr;
ptr=list->top;
while(ptr!=NULL){
printf("%d ",ptr->data);
ptr=ptr->next;
}
printf("\n");
}

int isEmpty(StackList list){
return list->count==0;
//return list->top==NULL;
}

void push(StackList list, int item){
nodeptr temp;
temp=(nodeptr)malloc(sizeof(Node));
temp->data=item;
temp->next=list->top;
list->top=temp;
(list->count)++;
}

void pop(StackList list){
nodeptr temp;
temp=list->top;
list->top=temp->next;
temp->next=NULL;
free(temp);
(list->count)--;
}

int inToPos(char string[]){
int i,a=0;
char postfix[MAX];
StackList list=create();
for(i=0;string[i]!='\0';i++){
if(!isOperator(string,i)){
postfix[a]=string[i];
a++;
}
else if(isEmpty(list))
push(list,string[i]);
else{
if(precedence(string[i])>precedence(list->top->data))
push(list,string[i]);
else{
postfix[a]=list->top->data;
a++;
pop(list);
if(!isEmpty(list)){
while(precedence(list->top->data)<=precedence(string[i])){
postfix[a]=list->top->data;
a++;
pop(list);
}
}
else
push(list,string[i]);
}
}
}
puts(postfix);
}


int isOperator(char string[], int i){
switch(string[i])
{
case '+':
case '-':
case '*':
case '%':
case '/': return true;

default: return false;
}
}

int precedence(char x){
switch(x)
{
case '%':
case '*':
case '/': return 2;
case '+':
case '-': return 1;

default: return 0;
}
}
int main(void){

char string[MAX]="a+b*c-d";
inToPos(string);
}

请注意 inToPos 函数是使用此算法创建的:

  • 从左到右扫描中缀字符串。
  • 初始化一个空堆栈。
  • 如果扫描到的字符是操作数,则将其添加到后缀字符串中。如果扫描到的字符是运算符并且堆栈为空将角色插入堆叠。
  • 如果扫描到的字符是一个运算符并且栈不为空,将字符的优​​先级与位于其顶部的元素进行比较堆栈(topStack)。如果 topStack 比扫描字符出栈 else 将扫描字符压入堆。只要堆栈不为空且 topStack 不重复此步骤优先于字符。重复此步骤直到扫描字符。
  • (扫描完所有字符后,我们必须添加任何字符堆栈可能必须到 Postfix 字符串。)如果堆栈不为空添加topStack 到 Postfix 字符串并弹出堆栈。重复此步骤只要堆栈不为空。
  • 返回后缀字符串。

最佳答案

您真的应该学习如何使用调试器,它是解决此类问题的绝佳工具。但是,我运行它并找出了您的问题:

在这一行:

while(precedence(list->top->data)<=precedence(string[i])){

当您遍历列表时,您需要每次都检查堆栈是否为空,而不仅仅是在进入循环之前。所以,做这样的事情:

while(!isEmpty(list) && precedence(list->top->data)<=precedence(string[i])){

相反。

关于c - 使用堆栈中缀到后缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15329919/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com