|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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;
- }
复制代码
希望这可以帮到你!如果还有其他问题,请随时提问。
|
|