回文序列问题
回文序列问题
搁浅的第四次数据结构实验:
实验四:回文判别
实验要求:称正读和反读都相同的字符序列为“回文”,如“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