回 帖 发 新 帖 刷新版面

主题:利用栈判断回文,看看程序哪出错了

#include <stdio.h>
#include <malloc.h>
#include <string.h>
#define OK 1
#define ERROR 0
typedef int Status;
//------栈的顺序存储表示------------
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct
{char *base;
 char *top;
 char stacksize;
}SqStack;
Status InitStack(SqStack &s)
{//构造一个空栈
 s.base=(char *)malloc(STACK_INIT_SIZE*sizeof(char));
 if(!s.base) return ERROR;
 s.top=s.base;
 s.stacksize=STACK_INIT_SIZE;
 return OK;
}
Status GetTop(SqStack s,char &e)
{//若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR
 if(s.base==s.top) return ERROR;
  e=*(s.top-1);
  return OK;
}
Status push(SqStack &s,char e)
{//插入e为新的栈顶元素
 if(s.top-s.base>=s.stacksize)
 {s.base=(char *)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(char));
  if(!s.base) return ERROR;
  s.top=s.base+s.stacksize;
  s.stacksize+=STACKINCREMENT;
 }
 *s.top++=e;
 return OK;
}
Status pop(SqStack &s,char &e)
{//若栈不空,则删除S的栈顶元素,用e返回其值,并返回炽OK;否则返回ERROR
    if(s.base==s.top) return ERROR;
    e=*--s.top;
    return OK;
}
Status StackEmpty(SqStack s)
{//判栈是否为空
 if(s.base==s.top)  return OK;
 else return ERROR;
}
main()
{char ch1[50],ch2[50],e;int i=0;SqStack s;
InitStack(s);
printf("请输入字符串:");
scanf("%s",ch1);
while(ch1[i++]!='\0')
push(s,ch1[i]);
i=0;
while(!StackEmpty(s))
{pop(s,e);  ch2[i++]=e;
}
/*for(i=0;i<n;i++)
if(ch1[i]=!ch2[i]) break;*/
if(!strcmp(ch1,ch2)) printf("输入的字符串是回文\n");
else printf("输入的字符串不是回文\n");
 
}

回复列表 (共4个回复)

沙发

这二句
while(ch1[i++]!='\0') //如果++放到这里,那么压入堆栈的就是下一个字符了,这应该不是你想要的吧...
push(s,ch1[i]);
是不是要改成这样:
while(ch1[i]!='\0')
push(s,ch1[i++]);

板凳

#include <stdio.h>
#include <malloc.h>
#include <string.h>
#define OK 1
#define ERROR 0
typedef int Status;
//------栈的顺序存储表示------------
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct
{char *base;
 char *top;
 char stacksize;
}SqStack;
Status InitStack(SqStack &s)
{//构造一个空栈
 s.base=(char *)malloc(STACK_INIT_SIZE*sizeof(char));
 if(!s.base) return ERROR;
 s.top=s.base;
 s.stacksize=STACK_INIT_SIZE;
 return OK;
}
Status GetTop(SqStack s,char &e)
{//若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR
 if(s.base==s.top) return ERROR;
  e=*(s.top-1);
  return OK;
}
Status push(SqStack &s,char e)
{//插入e为新的栈顶元素
 if(s.top-s.base>=s.stacksize)
 {s.base=(char *)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(char));
  if(!s.base) return ERROR;
  s.top=s.base+s.stacksize;
  s.stacksize+=STACKINCREMENT;
 }
 *s.top++=e;
 return OK;
}
Status pop(SqStack &s,char &e)
{//若栈不空,则删除S的栈顶元素,用e返回其值,并返回炽OK;否则返回ERROR
    if(s.base==s.top) return ERROR;
    e=*--s.top;
    return OK;
}
Status StackEmpty(SqStack s)
{//判栈是否为空
 if(s.base==s.top)  return OK;
 else return ERROR;
}
main()
{char ch1[50],ch2[50],e;int i=0;SqStack s;
InitStack(s);
printf("请输入字符串:");
scanf("%s",ch1);
while(ch1[i]!='\0')
push(s,ch1[i++]);
i=0;
while(!StackEmpty(s))
{pop(s,e);  ch2[i++]=e;
}
/*for(i=0;i<n;i++)
if(ch1[i]=!ch2[i]) break;*/
if(!strcmp(ch1,ch2)) printf("输入的字符串是回文\n");
else printf("输入的字符串不是回文\n");
 
}
按楼上的改了以后,还是调试不出来??

3 楼

请注意你的函数的形参和实参是否匹配。
例如:pop(SqStack &s,char &e)这里要求形参都是指针变量,而你的main函数中却是
pop(s,e);  s和e都不是指针变量。
还有很多这样的情况,你一一改过后应该就可以了。

4 楼

pop(SqStack &s,char &e)这里要求形参都是指针变量,而你的main函数中却是
pop(s,e);  s和e都不是指针变量。
------------------------------------------------
上述程序中的s,e是引用参数,故前面加&,不是指针变量,

我来回复

您尚未登录,请登录后再回复。点此登录或注册