回文序列问题

 

回文序列问题

搁浅的第四次数据结构实验

实验四:回文判别

实验要求:称正读和反读都相同的字符序列为“回文”,如“abba”和“abccba”是“回文”,“abcde”和“ababab”则不是“回文”,试设计一个算法,判别读入的一个以@为结束符的字符序列是否是“回文”。

实验目的:

1、掌握循环队列的定义及应用;

2、掌握队列的基本操作;

3、进一步熟练掌握栈的基本操作及应用;

4、初步学会解决具体问题的算法设计。

代码:

 

 

  1  /*  Status.h 各种常量状态、结构体的声明文件 */
  2  #pragma  once
  3  #include  < malloc.h >
  4  #include  < stdlib.h >
  5 
  6  #define  TRUE 1
  7  #define  FALSE 0
  8  #define  OK 1
  9  #define  ERROR 0
 10  #define  OVERFLOW -2
 11  #define  INFEASIBLE -1
 12 
 13  typedef  int  Status;
 14 
 15  typedef  char  SElemType;
 16  #define  STACK_INIT_SIZE 100
 17  #define  STACKINCREMENT  10
 18  struct  SqStack{
 19      SElemType  * base ;
 20      SElemType  * top;
 21       int  stacksize;
 22  };
 23 
 24  typedef  char  QElemType;
 25  #define  MAXQSIZE 100
 26  struct  SqQueue{
 27      QElemType  * base ;
 28       int  front;
 29       int  rear;
 30  };
 31 
 32  /*  SqQueue.h CSqQueue类的声明文件 */
 33  #pragma  once
 34  #include  " Status.h "
 35 
 36  class  CSqQueue
 37  {
 38  private :
 39       // 循环队列数据结构
 40      SqQueue Q;
 41  public :
 42      CSqQueue( void );
 43       ~ CSqQueue( void );
 44       // 插入队尾
 45      Status EnQueue(QElemType e);
 46       // 删除队头
 47      Status DeQueue(QElemType &  e);
 48  private :
 49       // 初始化队列,放在构造函数里,私有.
 50      Status InitQueue();
 51 
 52  };
 53 
 54  /*  SqQueue.cpp CSqQueue类的定义文件 */
 55  #include  " SqQueue.h "
 56 
 57  CSqQueue::CSqQueue( void )
 58  {
 59       this -> InitQueue();
 60  }
 61 
 62  CSqQueue:: ~ CSqQueue( void )
 63  {
 64      free( this -> Q. base );
 65  }
 66 
 67  // 插入队尾
 68  Status CSqQueue::EnQueue(QElemType e)
 69  {
 70       if ((Q.rear + 1 ) % MAXQSIZE  ==  Q.front)
 71           return  ERROR;
 72      Q. base [Q.rear]  =  e;
 73      Q.rear  =  (Q.rear + 1 ) % MAXQSIZE;
 74 
 75       return  OK;
 76  }
 77  // 删除队头
 78  Status CSqQueue::DeQueue(QElemType &  e)
 79  {
 80       if (Q.front  ==  Q.rear)
 81           return  ERROR;
 82      e  =  Q. base [Q.front];
 83      Q.front  =  (Q.front + 1 ) % MAXQSIZE;
 84 
 85       return  OK;
 86  }
 87 
 88  // 初始化队列,放在构造函数里,私有.
 89  Status CSqQueue::InitQueue()
 90  {
 91      Q. base   =  (QElemType * )malloc(MAXQSIZE * sizeof (QElemType));
 92       if  ( ! Q. base )
 93          exit(OVERFLOW);
 94      Q.front  =  Q.rear  =   0 ;
 95      
 96       return  OK;
 97  }
 98 
 99 
100  /*  SqStack.h CSqStack类的声明文件 */
101  #pragma  once
102  #include  " Status.h "
103 
104  class  CSqStack
105  {
106  private :
107       // 栈数据结构
108      SqStack S;
109  public :
110      CSqStack( void );
111       ~ CSqStack( void );
112       // 压栈
113      Status Push(SElemType e);
114       // 出栈
115      Status Pop(SElemType &  e);
116       // 判断是否为空
117       bool  Empty();
118  private :
119       // 初始化栈数据结构,放在构造函数里,私有了..
120      Status InitStack();
121  };
122 
123  /*  SqStack.h CSqStack类的定义文件 */
124  #include  " SqStack.h "
125 
126  CSqStack::CSqStack( void )
127  {
128       this -> InitStack();
129  }
130 
131  CSqStack:: ~ CSqStack( void )
132  {
133      free( this -> S. base );
134  }
135 
136  // 压栈
137  Status CSqStack::Push(SElemType e)
138  {
139       if  (S.top  -  S. base   >=  S.stacksize)
140      {
141          S. base   =  (SElemType * )realloc(S. base ,(S.stacksize + STACKINCREMENT) * sizeof (SElemType));
142           if  ( ! S. base )
143              exit(OVERFLOW);
144          S.top  =  S. base   +  S.stacksize;
145          S.stacksize  +=  STACKINCREMENT;
146      }
147       * S.top ++   =  e;
148      
149       return  OK;
150  }
151 
152  // 出栈
153  Status CSqStack::Pop(SElemType &  e)
154  {
155       if  (S.top  ==  S. base )
156           return  ERROR;
157      e  =   *-- S.top;
158 
159       return  OK;
160  }
161 
162  // 判断是否为空
163  bool  CSqStack::Empty()
164  {
165       return  S.top  ==  S. base   ?  TRUE : FALSE ; 
166  }
167 
168  // 初始化栈数据结构,放在构造函数里,私有了..
169  Status CSqStack::InitStack()
170  {
171      S. base   =  (SElemType * )malloc(STACK_INIT_SIZE * sizeof (SElemType));
172       if ( ! S. base )
173          exit(OVERFLOW);
174      S.top  =  S. base ;
175      S.stacksize  =  STACK_INIT_SIZE;
176 
177       return  OK;
178  }
179 
180 
181  /*  
182  ///
183  Main.cpp 
184  main函数所在文件
185  0x0o@Live.Cn
186  08.11.04
187  XP SP2 + VS2008 下编译通过.
188 
189  */
190 
191  #include  < iostream >
192  #include  " Status.h "
193  #include  " SqQueue.h "
194  #include  " SqStack.h "
195  using   namespace  std;
196 
197  int  main()
198  {
199       char  ch;
200      CSqStack st;
201      CSqQueue qu;
202      cout << " Please Input The String: " << endl;
203      cin >> ch;
204       while  (ch  !=   ' # ' )
205      {
206          st.Push(ch);
207          qu.EnQueue(ch);
208          cin >> ch;
209      }
210 
211       char  stch,quch;
212       while  ( true )
213      {
214          st.Pop(stch);
215          qu.DeQueue(quch);
216           if  (stch  !=  quch  ||  st.Empty())
217               break ;
218      }
219      
220       if (stch  ==  quch)
221          cout << " Yes,HuiWen String! " << endl;
222       else
223          cout << " Sorry,Not a HuiWen String " << endl;
224 
225       return   0 ;
226  }
227 

 

 

 

 

我好不容易提前认真写了次作业,结果竟然不用做了..愤恨啊....> 

一点说明:

LanStat(在做项目)真的很累人,每天都要Coding,每天都要Debug;我从中得到了什么?现在我很自豪的说,我真的学到了很多东西,其它的先不表,先说下写代码的能力,我作这个实验只用了20分钟,思考、架构、实现、测试,除了中间出去跑步锻炼了下身体,真的算是一气呵成,而且一次编译通过,完全没有错误!

虽然部分代码是直接抄书,但是我还是可以感觉到自己的进步,比以前强了很多,在上周连续四天的“闭关”写代码期间,除了吃饭就是Coding,正式代码+测试代码大约3000行,写的我都恶心了,现在有点收获,自然很开心,呵呵

 

写这个就是为了练习下栈和队列的基本操作问题,其实我这个代码属于垃圾中的垃圾,既浪费内存又浪费空间,但是我还是要这么写,因为仅仅是练习,呵呵

 

说下实现回文序列的其它算法:

例如,今天一个朋友(曾在此blog留言过的某人,很感谢哈)发给我的代码,完全不用数据结构,自然节省无数空间,而且时间复杂度也很好的说

另外说个思路,没写出代码:

把字符序列的前一半压栈,然后和后面对比,此方法还算是不错,有空写下,呵呵

 

 

Ps

今天本来要写下上周日的程序设计大赛的解题报告的,毕竟那个很简单,但是最近实在太忙,不晓得什么时候有空了,先把我的感悟写了:

 

首先,上周日我算是很对不起某两人的日子,在此道个歉吧,反正不会被看到,呵呵

 

小琪,我和你组队参加程序设计大赛的感觉真爽!我感觉我们配合很perfect,主要是你水平很强的说,然后我在旁边写了点测试数据、看了下你写的代码,帮你端茶倒水啥的,呵呵。初赛我们战绩很好,虽然帮不了你什么,但是真的很希望和你在一起去参加决赛,然后努力争取获奖!

但是,在这个最好的机会来临时,我却无法陪你战斗到最后,我真的感觉很对不起你的说..

在重大,你是经常教育我的人,呵呵。很少有人提醒我说,你要注意基础,不能天天只做些不脚踏实地的事情。你很好,是个真正的朋友,呵呵!16号,你可以和某些ACMER们来个决战,然后帮我扛个证书回来,奖金俺不跟你抢,哈哈

 

 

小谢,首先谢谢您周日那天预祝我们比赛成功哈,我们最后真的算是很成功!然后你算是因为我丢了手机..。虽然不能说是内疚,但是还是有点很郁闷的说..说对不起显的俺也太客气老..哎,大家都是最好的朋友,不说这些了,我们都是好孩子嘛,每天都要开心些!

 

 

每天进步一点点,胜利就在眼前!

 

 

                                       -------------by 0xQo

                                            Time 08.11.04 2356

 

转载于:https://www.cnblogs.com/ns517/archive/2008/11/05/1327235.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值