回文序列问题
搁浅的第四次数据结构实验:
实验四:回文判别
实验要求:称正读和反读都相同的字符序列为“回文”,如“abba”和“abccba”是“回文”,“abcde”和“ababab”则不是“回文”,试设计一个算法,判别读入的一个以@为结束符的字符序列是否是“回文”。
实验目的:
1、掌握循环队列的定义及应用;
2、掌握队列的基本操作;
3、进一步熟练掌握栈的基本操作及应用;
4、初步学会解决具体问题的算法设计。
代码:
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 23:56