gpt4 book ai didi

c - 使用堆栈中的问题

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

我正在学习数据结构,但在将数据插入堆栈时遇到了问题。尽管我在程序的早期使用了相同的推送功能,但它似乎并没有推送字符。该程序应将中缀表达式转换为后缀

当给定数字“1+2”时,它应该返回“12+”,但它只返回“12”谢谢指教

       bool revisar(char * inf, stack p){
inicializa(&p);
Nodo D;
char pos[MAX];
int i=0;
int j=0;
while(inf[i]!='\0')
{//WHILE
if(inf[i]>='0' && inf[i]<='9')
{
pos[j++]=inf[i++];
}
if(inf[i]=='(')
{
D.caracter=inf[i++];
push(&p,D);
}
if(inf[i]==')')
{

while(top(p).caracter!='(')
{
pos[j++]=pop(&p).caracter;
}
if(top(p).caracter=='(')
pop(&p);
i++;
}
else
{
if(inf[i]=='+'||inf[i]=='-'||inf[i]=='*'||inf[i]=='/')
{
if(empty(p)||top(p).caracter=='(')
{
D.cara

cter=inf[i++];
push(&p,D);
if(empty(p));
printf("NNNNNNOOOOOOOOOOOOOOOOOOOOOO"); **Here it prints that the stack is still empty....
}
else
{
if(menorpre(top(p).caracter,inf[i]))
{
D.caracter=inf[i++];
push(&p,D);
}
else
{
pos[j++]=pop(&p).caracter;
if(!empty(p))
{
if(top(p).caracter!='(')

pos[j++]=pop(&p).caracter;
}
else
{
D.caracter=inf[i++];
push(&p,D);
}
}
}
}
}
}
while(!empty(p)){
printf("ddd");
pos[j++]=pop(&p).caracter;
}
pos[j]='\0';

printf("\n \n");
printf("i=%d,j=%d",i,j);
printf("LA CADENA EN POSFIJO ES: ");
puts(pos);
}

我的堆栈库

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include "pila.h"

void inicializa(stack *p ){
*p = NULL;
}

bool empty(stack p){
if (p==NULL){
return true;
}
else return false;
}

int push(stack * p, Nodo n){
stack nuevo = (stack)malloc(sizeof(Nodo));
if(nuevo == NULL){
return 300;
}
*nuevo = n;
if(empty(*p)){
nuevo->next = NULL;
}
else{
nuevo->next = *p;
*p = nuevo;
}
return 301;
}


Nodo pop(stack * p){
Nodo copy = *(*p);
free(*p);
*p = copy.next;
inicializa(&copy.next);
return copy;
}

Nodo top(stack p){
Nodo copy;
copy = *p;
copy.next = NULL;
return copy;
}

头文件

struct nodo{
char caracter;
int numero;
struct nodo * next;
};
typedef struct nodo Nodo;
typedef Nodo * stack;
void inicializa(stack *p);
bool empty(stack p);
Nodo top(stack p);
Nodo pop(stack *p);
int push(stack *p, Nodo n);

最佳答案

简短的回答——在这段代码中:

int push(stack * p, Nodo n){
stack nuevo = (stack)malloc(sizeof(Nodo));
if(nuevo == NULL){
return 300;
}
*nuevo = n;
if(empty(*p)){
nuevo->next = NULL;
}
else{
nuevo->next = *p;
*p = nuevo;
}
return 301;
}

*p = nuevo; 应该在 else 之后,而不是在里面。无论如何它都适用。较长的答案:

您的堆栈代码存在多个问题,包括 malloc 内存管理不善。我建议采用更简单的堆栈设计,大致如下:

struct nodo {
char caracter;
struct nodo *next;
};

typedef struct nodo Nodo;
typedef Nodo *stack;

void inicializa(stack *p);
bool empty(stack p);
char top(stack p);
char pop(stack *p);
int push(stack *p, char c);

void inicializa(stack *p) {
*p = NULL;
}

bool empty(stack p) {
return (p == NULL);
}

int push(stack *p, char caracter) {
Nodo *nuevo = malloc(sizeof(*nuevo));

if (nuevo == NULL) {
return 300;
}

nuevo->caracter = caracter;

if (empty(*p)) {
nuevo->next = NULL;
} else {
nuevo->next = *p;
}

*p = nuevo;

return 301;
}

char pop(stack *p) {
Nodo *copy = *p;

*p = copy->next;

char caracter = copy->caracter;

free(copy);

return caracter;
}

char top(stack p) {
return p->caracter;
}

这需要沿以下行修改 revisar():

void revisar(char *inf, stack p)
{
char caracter;
char pos[MAX];
int i = 0;
int j = 0;

inicializa(&p);

while (inf[i] != '\0')
{
if (inf[i] >= '0' && inf[i] <= '9')
{
pos[j++] = inf[i++];
}
else if(inf[i] == '(')
{
(void) push(&p, inf[i++]);
}
else if (inf[i] == ')')
{
while (top(p) != '(')
{
pos[j++] = pop(&p);
}

if (top(p) == '(')
{
(void) pop(&p);
}

i++;
}
else
{
if (inf[i] == '+' || inf[i] == '-' || inf[i] == '*' || inf[i] == '/')
{
if (empty(p) || top(p) == '(')
{
(void) push(&p, inf[i++]);

if (empty(p))
{
printf("NNNNNNOOOOOOOOOOOOOOOOOOOOOO"); // Here it prints that the stack is still empty....
}
}
else
{
if (menorpre(top(p), inf[i]))
{
(void) push(&p, inf[i++]);
}
else
{
pos[j++] = pop(&p);

if (!empty(p))
{
if (top(p) != '(')
{
pos[j++] = pop(&p);
}
}
else
{
(void) push(&p, inf[i++]);
}
}
}
}
}
}

while (!empty(p))
{
pos[j++] = pop(&p);
}

pos[j]='\0';

printf("\n \n");
printf("i=%d, j=%d", i, j);
printf("LA CADENA EN POSFIJO ES: ");
puts(pos);
}

在我的测试中,我能够让 revisar("1+2", p); 产生:

% ./a.out
ddd

i=3, j=3LA CADENA EN POSFIJO ES: 12+
%

我猜这就是您所追求的。如果您对此有更多疑问,请确保将 menorpre() 的定义添加到上面的代码中,因为缺少的部分无法重建。

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

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