数据结构C语言问题?!!!!急求,看一下哪里错了

2025-03-18 09:36:57
推荐回答(1个)
回答1:

我说一下调试这个程序的整个过程,下次你也会调了

首先把调试的断点设置在

    while(stackempty(s))            //栈中还有元素

    if(pop(s)==dequeue(q)) //出栈的字符与出队列的字符匹配

这两句中

然后一步一步运行,看看结果是什么样


    首先发现,不管怎么样,都进不了while循环,这时候就去找你的stackempty(s)函数,

你是这么写的    return(s->top==-1);   

这样写明显不能判断是否为空。修改完毕之后,再调试,发现还是不行,这时候看到调试框中,每次出栈和出队的值不一样,然后就在主函数,入栈入队之后,马上打印出栈出队的值,看看是不是正确,然后就发现出栈是正确的,但是出队就不正确了,出队无法输入任何东西,这时候就去看dequeue()函数,

其中你是这么写的   if(q->front==-1)   return 0;看起来没错,但是再往上看,你入队的函数里面,入队之后并没有改变front的值,所以front一直是-1,这样的话,dequeue函数就永远都是返回的0,修改判断队列是否为空之后。然后打印出栈出队的时候发现,

typedef int elemtype;

而你需要的是char,修改之后,基本上就没问题了。我也没测试太多的数据,还有bug再修改吧。


#include
#include 
#include
#include
#define maxsize 50 
typedef char elemtype;
typedef struct
{
elemtype data[maxsize];
int top;
}sqstack;
void initstack(sqstack *&s)
{
s=(sqstack*)malloc(sizeof(sqstack));
s->top=-1;
}
void destroystack(sqstack *&s)
{
free(s);
}
bool stackempty(sqstack *s)//判断栈空
{
//return(s->top==-1);
return s->top==-1 ? 0 : 1;
}
bool push(sqstack *&s,elemtype e)
{
if(s->top==maxsize-1)
return false;
s->top++;
s->data[s->top]=e;
return true;
}
char pop(sqstack *&s)
{   
elemtype n;
if(s->top==-1)
return 0;
n=s->data[s->top];
s->top--;
return n;
}
typedef struct
{
elemtype data[maxsize];
int front, rear;
}sqqueue;
void initqueue(sqqueue *&q)
{
q=(sqqueue*)malloc(sizeof(sqqueue));
q->front=q->rear=-1;
}
void destroyqueue(sqqueue *&q)
{
free(q);
}
bool enqueue(sqqueue *&q,elemtype e)
{
if(q->rear==maxsize-1)
return false;
//q->front=0;
q->rear++;
q->data[q->rear]=e;
return true;
}
char dequeue(sqqueue *&q)
{
char n;
if(q->front>q->rear)
return 0;
q->front++;
n=q->data[q->front];
return n;
}
int abc(sqstack *&s,sqqueue *&q)
{
int m=0;
printf("stack=%d\n",stackempty(s));
while(stackempty(s))            //栈中还有元素
{
if(pop(s)==dequeue(q)) //出栈的字符与出队列的字符匹配
{
m=1;                  //将标志设置为1  
continue;                //继续从栈和队列中区字符
}
else                      //字符不匹配
{
m=0;
break;                   //跳出循环,将标志设置为0
}
}
return m;
}
int main()
{
int n,i,m;
char a[50];
sqstack *s;
sqqueue *q;
initstack(s);
initqueue(q);
printf("请输入一个字符序列:\n");
gets(a);
n=strlen(a);
puts(a);
for(i=0;i{
push(s,a[i]);
enqueue(q,a[i]);
//printf("%c",a[i]);
}
/*i=0;
while(iprintf("%c\t",pop(s));
printf("%c\t",dequeue(q));
printf("\n");
i++;
}*/
printf("m");
if(abc(s,q))
printf("是回文符\n");
else if(m==0)
printf("不是回文符\n");
}