|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
1. 建立一个顺序栈或链栈
2. 实现出栈、入栈、取栈顶元素的值,判空,输出操作
3. 借助一个栈判断上述已知字符序列是否为回文,如果是,则输出“此字符序列构成回文”,否则输出“此字符序列不构成回文”。
下面是我写的代码,但是无法运行判断回文的,请各位帮我看看哪错了。谢谢!!!#include<stdio.h>
#include<stdlib.h>
#define stack_init_size 100
#define stackincrement 10
typedef int selemtype;
typedef struct{
selemtype *base;
selemtype *top;
int stacksize;
}sqstack;
void initstack(sqstack &s)
{
s.base=(selemtype*)malloc(stack_init_size*sizeof(selemtype));
s.top=s.base;
s.stacksize=stack_init_size;
}
void push(sqstack &s,selemtype e)//入栈
{
if(s.top-s.base>=s.stacksize){
s.base=(selemtype*)realloc(s.base,(s.stacksize+stack_init_size)*sizeof(selemtype));
if(!s.base)
printf("error");
s.top=s.base+s.stacksize;
s.stacksize+=stack_init_size;
}
*s.top=e;
s.top++;
}
void pop(sqstack &s)//出栈
{
selemtype *e=s.top-1;
int i=0;
if(s.base==s.top){
printf("栈为空");
}
printf("%d ",*e);
s.top--;
}
void gettop(sqstack &s)//取栈顶元素
{
if(s.top!=s.base){
printf("\n此时栈顶元素为:");
printf("%d\n",*s.top-1);
}
}
void print(sqstack &s)//输出
{
selemtype *e=s.base;
int i=0;
while(i<(s.top-s.base))
{
printf("%d ",*e);
i++;
e++;
}
}
void judge(selemtype q)
{
int i,flag=0,a[100];
sqstack s2;
selemtype e,f;
initstack(s2);
for(i=0;i<q;i++){
scanf("%d ",&f);
a[i]=f;
}
for(i=0;i<(q-1)/2;i++){
push(s2,a[i]);
}
for(i=(q+1)/2;i<=q;i++)
{
if(*s2.top-1!=a[i])
{
break;
}
s2.top--;
flag=1;
}
if(flag==1){
printf("是回文序列!");
}
else {
printf("不是回文序列");
}
}
int main()
{
int n,i,m,a[100];
sqstack s,s1;
selemtype e,q,f;
initstack(s);
printf("请输入进栈的数量:\n");
scanf("%d",&n);
printf("请输入进栈的数字:\n");
for(i=0;i<n;i++)
{
scanf("%d",&e);
push(s,e);
}
printf("请问你想出栈几次:\n");
scanf("%d",&m);
for(i=0;i<m;i++){
pop(s);
}
gettop(s);
if(s.top==s.base){
printf("栈为空。\n");
}
else{
printf("栈内元素为:");
print(s);
}
printf("\n请输入你想要判断是否为回文的字符序列的长度:");
scanf("%d",&q);
judge(q);
}
这段代码存在几个问题:
1. 在函数 judge 中,使用了未初始化的栈 s2 ,应该在使用之前调用 initstack(s2) 进行初始化。
2. 在函数 judge 中,for循环的终止条件应该是 i<(q+1)/2 ,而不是 i<=q 。
3. 在函数 judge 中,比较栈顶元素和字符序列的元素是否相等时,应该使用 *s2.top-1 而不是 *s2.top 。
4. 在函数 judge 中,当判断为回文序列时,应该在循环结束之后设置 flag=1 ,而不是在循环内部。
5. 在函数 judge 中,判断回文序列的条件应该是 flag==0 ,而不是 flag==1 。
6. 在函数 judge 中,应该在 flag==0 的情况下输出"不是回文序列",而不是在 flag==1 的情况下输出。
7. 在函数 gettop 中,应该使用 s.top-1 而不是 s.top 来获取栈顶元素。
下面是修改后的代码:
#include <stdio.h>
#include <stdlib.h>
#define stack_init_size 100
#define stackincrement 10
typedef int selemtype;
typedef struct {
selemtype *base;
selemtype *top;
int stacksize;
} sqstack;
void initstack(sqstack &s)
{
s.base = (selemtype*)malloc(stack_init_size * sizeof(selemtype));
s.top = s.base;
s.stacksize = stack_init_size;
}
void push(sqstack &s, selemtype e)
{
if (s.top - s.base >= s.stacksize) {
s.base = (selemtype*)realloc(s.base, (s.stacksize + stack_init_size) * sizeof(selemtype));
if (!s.base)
printf("error");
s.top = s.base + s.stacksize;
s.stacksize += stack_init_size;
}
*s.top = e;
s.top++;
}
void pop(sqstack &s)
{
if (s.base == s.top) {
printf("栈为空");
}
else {
s.top--;
printf("%d ", *s.top);
}
}
void gettop(sqstack &s)
{
if (s.top != s.base) {
printf("\n此时栈顶元素为:%d\n", *(s.top - 1));
}
}
void print(sqstack &s)
{
selemtype *e = s.base;
while (e < s.top) {
printf("%d ", *e);
e++;
}
}
void judge(selemtype q)
{
int i, flag = 0, a[100];
sqstack s2;
selemtype e, f;
initstack(s2);
for (i = 0; i < q; i++) {
scanf("%d", &f);
a[ i] = f;
}
for (i = 0; i < (q + 1) / 2; i++) {
push(s2, a[ i]);
}
for (i = (q + 1) / 2; i < q; i++) {
if (*(s2.top - 1) != a[ i]) {
break;
}
s2.top--;
flag = 1;
}
if (flag == 0) {
printf("是回文序列!");
}
else {
printf("不是回文序列");
}
}
int main()
{
int n, i, m, a[100];
sqstack s, s1;
selemtype e, q, f;
initstack(s);
printf("请输入进栈的数量:\n");
scanf("%d", &n);
printf("请输入进栈的数字:\n");
for (i = 0; i < n; i++) {
scanf("%d", &e);
push(s, e);
}
printf("请问你想出栈几次:\n");
scanf("%d", &m);
for (i = 0; i < m; i++) {
pop(s);
}
gettop(s);
if (s.top == s.base) {
printf("栈为空。\n");
}
else {
printf("栈内元素为:");
print(s);
}
printf("\n请输入你想要判断是否为回文的字符序列的长度:");
scanf("%d", &q);
judge(q);
return 0;
}
希望这可以帮到你!如果还有其他问题,请随时提问。
|
|