| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1244 人关注过本帖
标题:此函数为检查输入的字符序列是否是回文。我写的有点小错误。请帮忙改正。谢 ...
只看楼主 加入收藏
ST默文
Rank: 1
来 自:青岛
等 级:新手上路
帖 子:4
专家分:0
注 册:2011-4-10
收藏
 问题点数:0 回复次数:7 
此函数为检查输入的字符序列是否是回文。我写的有点小错误。请帮忙改正。谢谢您
//下面的程序为解决判断以@为结束符的字符序列是否为回文。
//算法思路:分别创建一个栈,和一个队列。为其同时输入元素。
//充分利用其特点,栈后进先出。队列先进先出的特性。
//比较栈弹出的元素与出队元素是否相等。若相等,那么继续比较
//剩余的元素,直到栈空为止。若元素不相同,那么打印“不是回文“
//返回ERROR。
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define TURE  1
#define FALSE 0
#define OK    1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW   -2
typedef int Status;
typedef char SElemType;
typedef char QElemType;
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct {
    //栈的存储结构定义
    SElemType *base;
    SElemType *top;
    int stacksize;
}SqStack;
Status InitStack(SqStack &S){
    //初始化一个空栈
    S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
    if(!S.base) exit(ERROR);
    S.top=S.base;
    S.stacksize=STACK_INIT_SIZE;
    return OK;
}//InitStack
Status GetTop(SqStack &S,SElemType &e){
    //若栈不空,返回栈顶的元素,并返回OK;否则返回ERROR;
    if(S.top==S.base) return ERROR;//注意等号”==“
    e=*(S.top-1);//注意栈顶指针永远指向栈顶元素的下一个位置
    return OK;
}
Status Push(SqStack & S,SElemType e){
    //插入新的元素e使其成为新的栈顶元素
    //若栈满,则重新开辟空间,开辟空间后要判断是否成功
    if(S.top-S.base>=S.stacksize){
    //栈满了,追加空间
        S.base=(SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
        if(!S.base) exit(OVERFLOW);
        //这时不要忘记新栈的栈顶指针,即栈容量的改变
        S.top=S.base+S.stacksize;
        S.stacksize=S.stacksize+STACKINCREMENT;
    }//if
    *S.top=e;
    S.top++;
    return OK;
}//Push
Status Pop(SqStack &S,SElemType &e){
    //若栈不空,则删除栈顶元素,并用e带回,返回OK。否则
    //返回ERROR.
    if(S.top==S.base)return ERROR;
    e=*(--S.top);
    return OK;
}// Pop
typedef struct QNode{
    //链队列的结点类型定义
    QElemType data;
    struct QNode *next;
}QNode,*QueuePtr;
typedef struct{
    //链队列的存储结构定义。
    //一个链队列由分别指向队头和队尾的指针惟一确定
    QueuePtr front;//队头指针
    QueuePtr rear;//队尾指针
}LinkQueue;
Status InitQueue(LinkQueue &Q){
    //构造一个空的队列
    Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));//开辟空间
    if(!Q.front) exit(OVERFLOW);
    Q.front->next=NULL;
    return OK;
}//InitQueue
Status EnQueue(LinkQueue &Q,QElemType e){
    //插入元素e使其成为新的队尾元素
    QueuePtr p;
    p=(QueuePtr)malloc(sizeof(QNode));
    p->data=e;
    p->next=NULL;
    //以上为新建结点的过程,下面为链接的过程
    Q.rear->next=p;
    //此时新队列的队尾指针应该为新插入的元素
    Q.rear=p;
    return OK;
}//EnQueue
Status DeQueue(LinkQueue &Q,QElemType &e){
    //删除队列的队头元素,删除前应先判断队列是否为空。若空返回ERRORR
    //若删除后队列为空那么,应重新给Q.rear赋值为对头指针
    if(Q.front==Q.rear)return ERROR;
    QueuePtr p;
    p=Q.front->next;//p指向首元素
    e=p->data;
    Q.front->next=p->next;//Q.front现在指向了第二号元素
    if(Q.rear==p)
        Q.rear=Q.front;
    free(p);
    return OK;
}//DeQueue
Status CheckPalindrome(){
    //检验输入的字符串是否是回文,若是返回OK,否则返回ERROR
    //思路:同时使用栈,和队列两种存储结构。同时获取从键盘上输入字符
    //以@未结束符。输入完成后,只要栈不空,那么一次弹出栈顶元素与队列的头元素
    //比较。若相等返回OK;否则返回ERROR;
    SqStack S;LinkQueue Q;
    InitQueue(Q);
    InitStack(S);
    //以上未初始化栈和队列
    SElemType c;
    printf("请输入您将要检验的字符序列,以@结束:\n");
    while((c=putchar(c))!='@'){
    Push(S,c);EnQueue(Q,c);
    }//完成输入
    while(S.top!=S.base){
        //栈不空
        SElemType a;QElemType b;
        Pop(S,a);DeQueue(Q,b);
        if(a!=b){
            printf("输入的字符序列不是回文\n");
            return ERROR;
        }//if
        else{
            printf("输入的字符序列是回文\n");
            return OK;
        }//else
    }//while
    return OK;
}//CheckPalindrome
int main(){
printf("即将检验CheckPalindrome()的正确性,请做好准备!\n");
CheckPalindrome();
return 1;
}
//红色标注部分为我认为有错的地方,请帮忙改正,并简单讲解一下,如何能够做到
1、从键盘输入字符,若不是@那么就压入栈,EnQueue
谢谢了,在线等!谢谢!希望交流……
我是新手没钱打赏大家见谅吧!
真诚希望交流学习问题。我是ST默文.
搜索更多相关主题的帖子: 元素 
2011-04-10 13:44
ST默文
Rank: 1
来 自:青岛
等 级:新手上路
帖 子:4
专家分:0
注 册:2011-4-10
收藏
得分:0 
求指导
2011-04-10 14:30
ST默文
Rank: 1
来 自:青岛
等 级:新手上路
帖 子:4
专家分:0
注 册:2011-4-10
收藏
得分:0 
难道大家真的改不了吗。答案就是红色部分的字符串输入语句。
SElemType c;
printf("请输入您要检验的字符序列,并以‘@’结束\n");
while((c=getchar())!='@'){
  Push(c);EnQueue(c);
}//输入改写完毕
望大家一起交流新得,我是ST默文。
2011-04-10 19:42
lucky563591
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:765
专家分:2103
注 册:2009-11-18
收藏
得分:0 
如果是判断全文,不需要用到链表,我编过
2011-04-11 08:00
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
程序代码:
    while((c=getchar())!='@'){
    Push(S,c);EnQueue(Q,c);
    }//完成输入
    while(S.top!=S.base){
        //栈不空
        SElemType a;QElemType b;
        Pop(S,a);DeQueue(Q,b);
        if(a!=b){
            printf("输入的字符序列不是回文\n");
            return ERROR;
        }//if
        /*else{
            printf("输入的字符序列是回文\n");
            return OK;
        }//else*/
    }//while
    printf("输入的字符序列是回文\n");
2011-04-11 18:57
angelline
Rank: 1
等 级:新手上路
帖 子:18
专家分:3
注 册:2011-4-11
收藏
得分:0 
哇 好复杂用VB做就简单许多呢
2011-04-12 22:07
lucky563591
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:765
专家分:2103
注 册:2009-11-18
收藏
得分:0 
有这么复杂吗?直接去掉字符串的符号和空格,然后一个循环头尾比较就可以了。
2011-05-03 08:47
q491701201
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2011-5-12
收藏
得分:0 
用堆栈吧
2011-05-12 23:23
快速回复:此函数为检查输入的字符序列是否是回文。我写的有点小错误。请帮忙改正 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.037882 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved