13131116钱剑滨_队列和栈判断回文

13软工转本1 钱剑滨 实验报告

利用队列和栈判断回文实验报告

信息工程 系 13软工转本1 日期 2016年03月20日 姓名 钱剑滨 学号 13131116 电话 [1**********]

一、 实验内容

编写关于栈和队列操作的C 语言程序,要求能判断输入字符串是否为回文(回文:正序和逆序一样)。

二、 实验步骤

1. 分析栈和队列的实现算法。

2. 编写程序,通过队列来实现字符串正序输出,通过栈来实现字符串逆序输出。

3. 运行程序,纠正错误,对预测结果进行验证。

三、 设计概要

1. 本实验包含了7个函数:

a) 主函数 main()

b) 接收字符串函数get_string ()

c) 初始化队列函数init_queue ()

d) 初始化栈函数 init_stack ()

e) 入队函数 enter_queue ()

f) 出队函数 out_queue()

g) 压栈函数 push ()

h) 出栈函数 pop()

i) 字符串比较函数contrast()

四、 程序设计

1. 函数前包含的头文件名、结点类型定义、全局变量和函数声明 #include

#include

#include

#define N 100 //输入字符串的最大长度

typedef struct SeqQuene //定义循环队列

{

char *pBase_queue;

int front;

int rear;

}SeqQueue;

typedef struct SeqStack //定义栈

{

char *pBase_stack;

int bottom;

int top;

}SeqStack;

/*函数声明*/

void get_string(char *string_get, int *qString_side); //接受字符串

void init_queue(SeqQueue *queue, int string_side); //初始化队列

void init_stack(SeqStack *stack, int string_side); //初始化栈

void enter_queue(SeqQueue *queue, char *string_get, int

string_side); //入队

void out_queue(SeqQueue *queue, char *string_queue, int

string_side); //出队

void push(SeqStack *stack, char *string_get, int string_side); //压栈

void pop(SeqStack *stack, char *string_stack, int string_side);//出栈

void contrast(char *string_stack, char *string_queue, int string_side);

//字符串比较

2. 主函数main()

void main()

{

SeqStack stack; //这里定义普通变量,下面再传地址 SeqQueue queue; //如果定义指针变量会报错 char *string_get, *string_queue, *string_stack;

//定义字符指针,分别存放接收字符串、顺序输出字符串、逆序

输出字符串

int string_side; //定义接收字符串的长度

string_get = (char *)malloc(sizeof (char) * N);

//给字符指针分配空间,必须在声明的函数内部

get_string(string_get, &string_side); //接受字符串

string_queue = (char *)malloc(sizeof (char) * (string_side + 1));

string_stack = (char *)malloc(sizeof (char) * (string_side + 1));

init_queue(&queue, string_side); //初始化队列

init_stack(&stack, string_side); //初始化栈

enter_queue(&queue, string_get, string_side);

out_queue(&queue, string_queue, string_side);

push(&stack, string_get, string_side);

pop(&stack, string_stack, string_side);

contrast(string_stack, string_queue, string_side);

}

3. 接收字符串函数get_string ()

void get_string(char *string_get, int *qString_side) //接收字符串

{

int string_side;

printf("请输入要判断的字符串\n");

scanf("%s", string_get);

string_side = *qString_side = strlen(string_get);

//判断字符串长度

printf("输入的字符串长度为%d\n", string_side);

}

4. 初始化队列函数init_queue ()

void init_queue(SeqQueue *queue, int string_side) //初始化队列

{

queue->pBase_queue = (char *)malloc(sizeof (char) *

(string_side + 1));

queue->front = 0;

queue->rear = 0;

}

5. 初始化栈函数init_stack ()

void init_stack(SeqStack *stack, int string_side) //初始化栈

{

stack->pBase_stack = (char *)malloc(sizeof (char) *

(string_side + 1));

stack->bottom = -1;

stack->top = -1;

}

6. 入队函数enter_queue ()

void enter_queue(SeqQueue *queue, char *string_get, int

string_side) //入队

{

int i = 0;

while((queue->rear+1) % (string_side + 1) != queue->front) //队列满时跳出循环

{

queue->pBase_queue[queue->rear] = string_get[i]; //依次在队列里添加字符

queue->rear = (queue->rear + 1) % (string_side + 1); //循环队列

i++;

}

}

7. 出队函数out_queue()

void out_queue(SeqQueue *queue, char *string_queue, int

string_side) //出队

{

int i = 0;

while(queue->rear != queue->front) //当队列空时跳出循环

{

string_queue[i] = queue->pBase_queue[queue->front]; //依次取出队列里字符

queue->front = (queue->front + 1) % (string_side + 1);

//循环队列

i++;

}

string_queue[i] = '\0'; //字符串结束

printf("顺序输出为:");

printf("%s\n",string_queue);

}

8. 压栈函数push ()

void push(SeqStack *stack, char *string_get, int string_side)

//压栈

{

int i = 0;

while(string_side--)

{

stack->top++; //top指针先后移一位

stack->pBase_stack[stack->top] = string_get[i];

//一次在栈里添加字符

i++;

}

}

9. 出栈函数 pop()

void pop(SeqStack *stack, char *string_stack, int string_side)

//出栈

{

int i = 0;

while(stack->top != stack->bottom) //栈空时跳出循环

{

string_stack[i] = stack->pBase_stack[stack->top];

//依次取出栈里字符

stack->top--; //top指针前移一位

i++;

}

string_stack[i] = '\0'; //字符串结束

printf("逆序输出为:");

printf("%s\n",string_stack);

}

10. 字符串比较函数contrast()

void contrast(char *string_stack, char *string_queue, int string_side) //字符串比较

{

int i, k;

for(k = 0; k

{

if(string_stack[k] == string_queue[k]) //字符串中各个元素依次比较

i = 1;

else

{

i = 0;

break; //只要有一个不同就跳出循环

}

}

if(i)

printf("输入字符串是回文\n");

else

printf("输入字符串不是回文\n");

}

五、 测试结果

1. 当输入回文字符串时,有如下结果:

2. 当输入不是回文字符串时,结果如下:

六、 总结反思

拿到题目时,想到总体思路是让字符串正序和逆序比较。正好符合队列和栈的操作需求。看来一下队列和栈的算法后,发现不是很难。

在设计程序时,总体思路有,但具体细节实现有些困难。比如队列和栈该定义怎样的结构体。数组有局限性,不能动态地满足字符串的长度。我就定义了指针变量。

以前不怎么使用指针,不怎么熟悉,这次在使用指针时地址没有分配好,导致函数调用时出错。下次在定义指针时要时刻注意地址。平时尽量定义普通变量,如需要再传递变量的地址。

13软工转本1 钱剑滨 实验报告

利用队列和栈判断回文实验报告

信息工程 系 13软工转本1 日期 2016年03月20日 姓名 钱剑滨 学号 13131116 电话 [1**********]

一、 实验内容

编写关于栈和队列操作的C 语言程序,要求能判断输入字符串是否为回文(回文:正序和逆序一样)。

二、 实验步骤

1. 分析栈和队列的实现算法。

2. 编写程序,通过队列来实现字符串正序输出,通过栈来实现字符串逆序输出。

3. 运行程序,纠正错误,对预测结果进行验证。

三、 设计概要

1. 本实验包含了7个函数:

a) 主函数 main()

b) 接收字符串函数get_string ()

c) 初始化队列函数init_queue ()

d) 初始化栈函数 init_stack ()

e) 入队函数 enter_queue ()

f) 出队函数 out_queue()

g) 压栈函数 push ()

h) 出栈函数 pop()

i) 字符串比较函数contrast()

四、 程序设计

1. 函数前包含的头文件名、结点类型定义、全局变量和函数声明 #include

#include

#include

#define N 100 //输入字符串的最大长度

typedef struct SeqQuene //定义循环队列

{

char *pBase_queue;

int front;

int rear;

}SeqQueue;

typedef struct SeqStack //定义栈

{

char *pBase_stack;

int bottom;

int top;

}SeqStack;

/*函数声明*/

void get_string(char *string_get, int *qString_side); //接受字符串

void init_queue(SeqQueue *queue, int string_side); //初始化队列

void init_stack(SeqStack *stack, int string_side); //初始化栈

void enter_queue(SeqQueue *queue, char *string_get, int

string_side); //入队

void out_queue(SeqQueue *queue, char *string_queue, int

string_side); //出队

void push(SeqStack *stack, char *string_get, int string_side); //压栈

void pop(SeqStack *stack, char *string_stack, int string_side);//出栈

void contrast(char *string_stack, char *string_queue, int string_side);

//字符串比较

2. 主函数main()

void main()

{

SeqStack stack; //这里定义普通变量,下面再传地址 SeqQueue queue; //如果定义指针变量会报错 char *string_get, *string_queue, *string_stack;

//定义字符指针,分别存放接收字符串、顺序输出字符串、逆序

输出字符串

int string_side; //定义接收字符串的长度

string_get = (char *)malloc(sizeof (char) * N);

//给字符指针分配空间,必须在声明的函数内部

get_string(string_get, &string_side); //接受字符串

string_queue = (char *)malloc(sizeof (char) * (string_side + 1));

string_stack = (char *)malloc(sizeof (char) * (string_side + 1));

init_queue(&queue, string_side); //初始化队列

init_stack(&stack, string_side); //初始化栈

enter_queue(&queue, string_get, string_side);

out_queue(&queue, string_queue, string_side);

push(&stack, string_get, string_side);

pop(&stack, string_stack, string_side);

contrast(string_stack, string_queue, string_side);

}

3. 接收字符串函数get_string ()

void get_string(char *string_get, int *qString_side) //接收字符串

{

int string_side;

printf("请输入要判断的字符串\n");

scanf("%s", string_get);

string_side = *qString_side = strlen(string_get);

//判断字符串长度

printf("输入的字符串长度为%d\n", string_side);

}

4. 初始化队列函数init_queue ()

void init_queue(SeqQueue *queue, int string_side) //初始化队列

{

queue->pBase_queue = (char *)malloc(sizeof (char) *

(string_side + 1));

queue->front = 0;

queue->rear = 0;

}

5. 初始化栈函数init_stack ()

void init_stack(SeqStack *stack, int string_side) //初始化栈

{

stack->pBase_stack = (char *)malloc(sizeof (char) *

(string_side + 1));

stack->bottom = -1;

stack->top = -1;

}

6. 入队函数enter_queue ()

void enter_queue(SeqQueue *queue, char *string_get, int

string_side) //入队

{

int i = 0;

while((queue->rear+1) % (string_side + 1) != queue->front) //队列满时跳出循环

{

queue->pBase_queue[queue->rear] = string_get[i]; //依次在队列里添加字符

queue->rear = (queue->rear + 1) % (string_side + 1); //循环队列

i++;

}

}

7. 出队函数out_queue()

void out_queue(SeqQueue *queue, char *string_queue, int

string_side) //出队

{

int i = 0;

while(queue->rear != queue->front) //当队列空时跳出循环

{

string_queue[i] = queue->pBase_queue[queue->front]; //依次取出队列里字符

queue->front = (queue->front + 1) % (string_side + 1);

//循环队列

i++;

}

string_queue[i] = '\0'; //字符串结束

printf("顺序输出为:");

printf("%s\n",string_queue);

}

8. 压栈函数push ()

void push(SeqStack *stack, char *string_get, int string_side)

//压栈

{

int i = 0;

while(string_side--)

{

stack->top++; //top指针先后移一位

stack->pBase_stack[stack->top] = string_get[i];

//一次在栈里添加字符

i++;

}

}

9. 出栈函数 pop()

void pop(SeqStack *stack, char *string_stack, int string_side)

//出栈

{

int i = 0;

while(stack->top != stack->bottom) //栈空时跳出循环

{

string_stack[i] = stack->pBase_stack[stack->top];

//依次取出栈里字符

stack->top--; //top指针前移一位

i++;

}

string_stack[i] = '\0'; //字符串结束

printf("逆序输出为:");

printf("%s\n",string_stack);

}

10. 字符串比较函数contrast()

void contrast(char *string_stack, char *string_queue, int string_side) //字符串比较

{

int i, k;

for(k = 0; k

{

if(string_stack[k] == string_queue[k]) //字符串中各个元素依次比较

i = 1;

else

{

i = 0;

break; //只要有一个不同就跳出循环

}

}

if(i)

printf("输入字符串是回文\n");

else

printf("输入字符串不是回文\n");

}

五、 测试结果

1. 当输入回文字符串时,有如下结果:

2. 当输入不是回文字符串时,结果如下:

六、 总结反思

拿到题目时,想到总体思路是让字符串正序和逆序比较。正好符合队列和栈的操作需求。看来一下队列和栈的算法后,发现不是很难。

在设计程序时,总体思路有,但具体细节实现有些困难。比如队列和栈该定义怎样的结构体。数组有局限性,不能动态地满足字符串的长度。我就定义了指针变量。

以前不怎么使用指针,不怎么熟悉,这次在使用指针时地址没有分配好,导致函数调用时出错。下次在定义指针时要时刻注意地址。平时尽量定义普通变量,如需要再传递变量的地址。


相关内容

  • 数据结构实验二(栈和队列)
  • 实验二 栈和队列的基本操作及其应用 一.实验目的 1.掌握栈和队列的顺序存储结构和链式存储结构,以便在实际中灵活应用. 2.掌握栈和队列的特点,即后进先出和先进先出的原则. 3.掌握栈和队列的基本运算,如:入栈与出栈,入队与出队等运算在顺序存储结构和链式存储结构上的实现. 二.实验内容 本次实验提供 ...

  • 实验报告--栈和队列的应用
  • 实验5 栈和队列的应用 目的和要求: (1)熟练栈和队列的基本操作: (2)能够利用栈与队列进行简单的应用. 一.题目 题目1.利用顺序栈和队列,实现一个栈和一个队列,并利用其判断一个字符 串是否是回文.所谓回文,是指从前向后顺读和从后向前倒读都一样的字符串. 例如,a+b&b+a等等. 题 ...

  • 数据结构题库
  • 第一章绪论 一,选择题 1.组成数据的基本单位是(C ) A .数据项B .数据类型C .数据元素D .数据变量 2.数据结构是研究数据的(C )以及它们之间的相互关系. A .理想结构,物理结构B .理想结构,抽象结构 C .物理结构,逻辑结构D .抽象结构,逻辑结构 3.算法分析的两个主要方面是 ...

  • 网易游戏笔试题
  • 网易游戏笔试题(总共分为两卷,I卷和II卷,如果I卷未达到指定分数,将不会查看II卷,成绩主要依据II卷来评定) I卷包括30个小题,II卷包括7个大题,总共3个小时来作答. 此笔试题是II卷内容. 1.智力题.将1到9等9个数字填入到下图中,使得行列值相等,并写出推理过程. 2.英雄升级,从0级升 ...

  • 汉字与诗歌艺术
  • 汉字与诗歌艺术 摘要: 汉字,作为历史的载体,民族文化的化石,是前人智慧的结晶,是中华文化中不可割舍的重要组成部分.它既是文化的产物,但同时它又服务于文化,促进文化的进步与发展.诗歌作为重要的文学艺术形式,与汉字具有密不可分的关联.汉字的使用展现了诗歌形式的严谨与变化性,形成了多样而独特的诗歌体裁样 ...

  • 动物中的数学
  • 动物中的数学"天才" 蜜蜂蜂房是严格的六角柱状体,它的一端是平整的六角形开口,另一端是封闭的六角菱锥形的底,由三个相同的菱形组成.组成底盘的菱形的钝角为109度28分,所有的锐角为70度32分,这样既坚固又省料.蜂房的巢壁厚0.073毫米,误差极小. 丹顶鹤总是成群结队迁飞,而且 ...

  • 回文的艺术色彩
  • 中国文字,向来以博大精深,内涵深厚著称,而回文,更是这种特色和文化的一种延续和流传.回文,就是指把相同的词汇或句子,在下文中调换位置或颠倒过来,产生首尾回环的情趣,也叫回环.是汉语特有的一种使用词序回环往复的修辞方法,文体上称之为"回文体". 说到回文,又不得不提到回文诗.回文诗 ...

  • 回文诗拾趣
  • 回文诗拾趣 1. 双篇回复式回文诗,双篇回复式即由两篇完成一个回复.如: 回文诗中最有名的是宋代李禺写的<夫妻互忆回文诗>,顺读为"夫忆妻": 枯眼望遥山隔水,往来曾见几心知? 壶空怕酌一杯酒,笔下难成和韵诗. 途路阳人离别久,讯音无雁寄回迟. 孤灯夜守长寥寂,夫忆妻 ...

  • java课后习题
  • Java编程习题 输出一行信息"This is a c program" 从键盘输入两个数,求较大者并输出 输入a,b,c三个值,输出其中最大者 求5! 从键盘输入一个大写字母,要求改用小写字母输出 写程序,判断某一年是否为闰年 求1+2+3+„+100的和 求2+4+6+„+1 ...