回文序列问题

 

回文序列问题

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

实验四:回文判别

实验要求:称正读和反读都相同的字符序列为“回文”,如“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

 

posted @ 2008-11-05 12:53  端木  阅读(4048)  评论(1编辑  收藏  举报