栈相关
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;
sqstack s2;
selemtype e,f;
initstack(s2);
for(i=0;i<q;i++){
scanf("%d ",&f);
a=f;
}
for(i=0;i<(q-1)/2;i++){
push(s2,a);
}
for(i=(q+1)/2;i<=q;i++)
{
if(*s2.top-1!=a)
{
break;
}
s2.top--;
flag=1;
}
if(flag==1){
printf("是回文序列!");
}
else {
printf("不是回文序列");
}
}
int main()
{
int n,i,m,a;
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);
} 你的代码中存在一些问题,我已经帮你修复了。以下是修复后的代码:
#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+stackincrement)*sizeof(selemtype));
if(!s->base) printf(\"error\");
s->top=s->base+s->stacksize;
s->stacksize+=stackincrement;
}
*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(\"\
此时栈顶元素为:\");
printf(\"%d\
\",*(s->top-1));
}
}
void print(sqstack *s) {
selemtype *e=s->base;
while(e<s->top) {
printf(\"%d \",*e);
e++;
}
}
void judge(int q) {
int i,flag=1,a;
sqstack s2;
selemtype f;
initstack(&s2);
for(i=0;i<q;i++){
scanf(\"%d\",&f);
a[ i]=f;
}
for(i=0;i<q/2;i++){
push(&s2,a[ i]);
}
for(i=(q+1)/2;i<q;i++)
{
if(*(s2.top-1)!=a[ i])
{
flag=0;
break;
}
pop(&s2);
}
if(flag==1){
printf(\"是回文序列!\
\");
}
else {
printf(\"不是回文序列\
\");
}
}
int main() {
int n,i,m,q;
sqstack s;
selemtype e;
initstack(&s);
printf(\"请输入进栈的数量:\
\");
scanf(\"%d\",&n);
printf(\"请输入进栈的数字:\
\");
for(i=0;i<n;i++)
{
scanf(\"%d\",&e);
push(&s,e);
}
printf(\"请问你想出栈几次:\
\");
scanf(\"%d\",&m);
for(i=0;i<m;i++){
pop(&s);
}
gettop(&s);
if(s.top==s.base){
printf(\"栈为空。\
\");
}
else{
printf(\"栈内元素为:\");
print(&s);
}
printf(\"\
请输入你想要判断是否为回文的字符序列的长度:\");
scanf(\"%d\",&q);
judge(q);
return 0;
}
主要的修改点有:
1. 在函数参数中,你应该使用指针,而不是引用。在C语言中,没有引用的概念,所以你需要使用指针来改变结构体的值。
2. 在judge函数中,你需要在比较完一个元素后,将其从栈中弹出。
3. 在pop函数中,你需要先将栈顶指针向下移动,然后再输出元素。
4. 在realloc函数中,你应该增加的是stackincrement,而不是stack_init_size。
5. 在print函数中,你应该使用while循环,直到e<s->top,而不是使用for循环。
希望这些修改能帮助你解决问题。
请注意,本回答来自GPT-4
如果问题已经解决,请设置最佳答案 你的代码中存在几个问题:
1. 栈的初始化和入栈操作没有问题。但是在出栈操作中,你没有判断栈是否为空,如果栈为空就无法进行出栈操作。
2. 在取栈顶元素的函数中,输出的值有误。应该是*(s.top-1),而不是*s.top-1。
3. 判断回文的逻辑有误。你可以借助一个栈来判断回文。首先将前一半的字符入栈,然后遍历后一半的字符,与栈顶元素进行比较。如果相等,则继续弹出栈顶元素;如果不相等或者栈为空,则说明不是回文。
下面是修改后的代码:
#include <stdio.h>
#include <stdlib.h>
#define stack_init_size 100
#define stack_increment 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_increment) * sizeof(SElemType));
if (!s.base) {
printf("error");
return;
}
s.top = s.base + s.stacksize;
s.stacksize += stack_increment;
}
*(s.top) = e;
s.top++;
}
void Pop(SqStack& s) {
if (s.top == s.base) {
printf("栈为空");
return;
}
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++;
}
}
int Judge(int q) {
int i, flag = 1, a;
SqStack s2;
SElemType e, f;
InitStack(s2);
for (i = 0; i < q; i++) {
scanf("%d", &f);
a = f;
}
for (i = 0; i < q / 2; i++) {
Push(s2, a);
}
if (q % 2 == 0) {
i = q / 2;
} else {
i = q / 2 + 1;
}
while (i < q && flag == 1) {
if (*(s2.top - 1) != a) {
flag = 0;
}
Pop(s2);
i++;
}
if (flag == 1) {
printf("是回文序列!");
} else {
printf("不是回文序列");
}
return flag;
}
int main() {
int n, i, m, q;
SqStack s;
SElemType e;
InitStack(s);
printf("请输入进栈的数量:");
scanf("%d", &n);
printf("请输入进栈的数字:");
for (i = 0; i < n; i++) {
scanf("%d", &e);
Push(s, e);
}
printf("请问你想出栈几次:");
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;
}
注意事项:
1. 在输入字符序列时,不要在每个数字后添加空格。
2. 函数Judge返回一个标志位,用于判断是否为回文。这样你可以根据需要进行处理。
希望对你有帮助!如有更多问题,请随时提问。
球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:} 这段代码存在几个问题:
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;
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;
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;
}
希望这可以帮到你!如果还有其他问题,请随时提问。
页:
[1]