栈和队列的基本操作实验报告
一、实验目的
1、熟练掌握栈和队列的基本操作在两种存储结构上的实现。
2、会用栈和队列解决简单的实际问题。
二、实验内容
题目:试写一个算法,判断依次读入的一个以@为结束符的字符序列,是否为回文。
所谓“回文“是指正向读和反向读都一样的一字符串,如“321123”或“ableelba”。
设计相关函数声明:
判断函数:int IsReverse()
栈:int InitStack(SqStack &S )
int
Push(SqStack &S, SElemType e )
int Pop(SqStack &S,SElemType &e)
int StackEmpty(s)
三、实验步骤
㈠、数据结构与核心算法的设计描述
相关常量及结构定义:
# define STACK_INIT_SIZE 100
# define STACKINCREMENT 10
# define OK 1
# define ERROR 0
struct stack
//栈类型定义
{
char *base;
char *top;
}st;
Struct queue
{
Char *front;
Char *rear;
//队列定义
}q;
㈡、函数调用及主函数设计
开始
主函数
构建栈函数
构建队列函数
输入字符
判 断 字 符
是否为@
否
是
字符出栈函数
字符出队函数
否
判 断 输 出 字
符是否相等
否
是
判断字符串是
否输出完毕
是
Return OK
Return ERROR
结束
函数调用及主程序设计图
㈢ 程序调试及运行结果分析
这次实验给了我一个很深刻的教训,我的程序写出来之后基本上没有什么问题,编译
运行都没错,但由于没有经过充分的测试,只用几个“回文”测试了一下,输出结果正确,
结果一个室友帮我调试程序的时候,用一个非回文的字符串试了一下,输出结果也是回文,
我找毛病找了将近一天,终于找到源代码错在哪儿了,原来我把栈和队列都当成栈来处理了。
纠正这个错误之后,程序的结果正确了。
㈣ 实验总结
通过这次实验,我对栈和队列的区别和用法更加深入的理解,这是我最大的收获。先
前对栈和队列的认识过于狭隘,而且对其用法很不熟练,只是模糊地知道该怎样操作,但没
有真正的尝试过,这次实验使我受益匪浅。通过这次实验,我深刻的意识到程序必须用尽可
能多的测试用例测试,而且测试用例的涵盖面要尽可能广,这样才能保证程序的可靠性。我
会再接再厉,争取在以后的实验中有更大的进步。
四、主要算法流程图及程序清单
1、主要算法流程图:
开始
从栈尾输出一个字符
从队列头输出一个字符
否
判 断 这 俩 字
符是否相等
是
Return ERROR
判断字符串是
否输出完毕
否
是
Return OK
结束
回文判定函数设计流程图
2、程序清单
#include
# define INIT_SIZE 100
# define INCREMENT 10
# define OK 1
# define ERROR 0
#include
#include
char e,*c1,*c2;
struct stack
//栈定义
{
char * base;
char * top;
}st;
struct queue
{
char* front;
char* rear;
}q;
void initst()
{
c2=st.base=new char[INIT_SIZE];
if(st.base)
{
cout<<"构建栈成功!"<
=INIT_SIZE)
{
q.rear=(char*)realloc(q.rear,INCREMENT);
if (!q.rear)
{
cout<<"内存分配失败!"<return OK;
}
int deleteq()
{
char b;
if (q.rear==q.front)
{
cout<<"队列输出完毕!"<
=INIT_SIZE)
{
//从队头删除一个字符
//让输入的字符入队列
st.base=(char *)realloc(st.base,(INIT_SIZE+INCREMENT)*sizeof(char));
if(!st.base)
{
cout<<"内存分配失败!"<while ((e=getchar())!='@')//输入字符串,若输入的字符为“@”,则字符串输入结束
{
enterq();
push();
//让输入的字符入队
//让输入的字符串进栈
//让字符串出栈出队,并对字符进行比较,若字符不相
等或字符串输出完毕,则程序结束,并释放分配的内
存空间。
}
while(q.front!=q.rear)
{
a=pop();
b=deleteq();
if (a!=b)
{
cout<<"YES "<