数据实验报告书回文检验

合集下载

数据结构回文实验报告

数据结构回文实验报告

数据结构回文实验报告1. 实验目的本实验旨在通过使用数据结构中的栈和队列的知识,设计并实现一个回文判断程序,以检测给定的字符串是否为回文。

2. 实验原理回文是指正读和反读都相同的字符串。

在本实验中,我们将使用栈和队列来判断给定字符串是否为回文。

具体步骤如下:2.1 将字符串加入栈和队列将给定的字符串依次加入栈和队列中,保持顺序一致。

2.2 从栈和队列中弹出字符从栈和队列中分别弹出字符,并进行比较。

2.3 判断是否为回文如果所有字符都一一相等,那么该字符串就是回文。

否则,不是回文。

3. 实验步骤接下来,我们将按照上述原理,逐步进行回文判断的实验。

3.1 导入所需库由于本实验仅使用了基本的数据结构,无需导入额外的库或模块。

3.2 创建栈和队列首先,我们需要创建栈和队列的数据结构。

栈可以通过使用列表来实现,而队列则可以通过使用双端队列来实现。

# 创建栈stack = []# 创建队列from collections import dequequeue = deque()3.3 输入字符串接下来,我们需要从用户获取一个待判断的字符串。

# 获取待判断的字符串string = input("请输入待判断的字符串:")3.4 将字符串加入栈和队列将输入的字符串依次加入栈和队列中。

# 将字符串加入栈和队列for char in string:stack.append(char)queue.append(char)3.5 从栈和队列中弹出字符并比较从栈和队列中分别弹出字符,并进行比较,直到栈或队列为空。

is_palindrome =Truewhile len(stack) >0and len(queue) >0:stack_char = stack.pop()queue_char = queue.popleft()if stack_char != queue_char:is_palindrome =Falsebreak3.6 输出判断结果根据比较结果,输出判断字符串是否为回文。

回文串实验报告

回文串实验报告

回文串实验报告课程名称:数据结构实验名称:单链表学生姓名:杜克强学生学号: 201207092427实验一回文串的基本操作及其应用一、实验目的1、掌握栈和队列的顺序存储结构和链式存储结构,以便在实际中灵活应用。

2、掌握栈和队列的特点,即后进先出和先进先出的原则。

3、掌握栈和队列的基本运算,如:入栈与出栈,入队与出队等运算在顺序存储结构和链式存储结构上的实现。

二、实验内容和要求[问题描述]对于一个从键盘输入的字符串,判断其是否为回文。

回文即正反序相同。

如“abba”是回文,而“abab”不是回文。

[基本要求](1)数据从键盘读入;(2)输出要判断的字符串;(3)利用栈的基本操作对给定的字符串判断其是否是回文,若是则输出“Yes”,否则输出“No”。

[测试数据]由学生任意指定。

三、实验步骤1.需求分析本演示程序用C语言编写,完成对一个字符串是否是回文字符串的判断①输入一个任意的字符串;②对输入的字符串进行判断是否为回文串;③输出判断结果;④测试数据:A.依次输入“abccba”,“asddas”等数据;B.输出判断结果“Yes”,“No”等四、算法设计1、算法思想:把字符串中的字符逐个分别存储到队列和堆栈中,然后逐个出队和出栈并比较出队列的数据元素和退栈的数据元素是否相等,若相等则是会文,否则不是。

2、模块设计(1)int Palindrome_Test()判断字符序列是否为回文串;(2)Status main()主函数;(3)Status CreatStack(SqStack &S)创建一个栈;(4)Status Push(SqStack &S,SElemType e)入栈;(5)Status Pop(SqStack &S ,SElemType &e)出栈;(6)Status CreatQueue(LinkQueue &Q)创建一个队列;(7)Status EnQueue(LinkQueue &Q,QElemType e)入队;(8)Status DeQueue(LinkQueue &Q,QElemType &e)出队;3、模块之间关系及其相互调用的图示4、数据存储结构图五、调试分析一、实验结果图2 实验结果二、总结通过做回文串实验让我同时用到了栈和队列两种结构,让我对这两种结构有了一个比较深入的了解和应用,对我以后的编程产生了比较深远的影响。

数据检测法实验报告(3篇)

数据检测法实验报告(3篇)

第1篇一、实验目的本次实验旨在通过数据检测法,验证数据清洗、处理和分析在数据挖掘和机器学习中的重要性。

通过实验,使学生掌握数据检测的基本方法,提高数据质量,为后续的数据挖掘和机器学习提供高质量的数据基础。

二、实验原理数据检测法是指通过对数据进行清洗、处理和分析,找出数据中的异常值、缺失值、重复值等不完整或不准确的数据,并对其进行修正或删除,以提高数据质量。

数据检测主要包括以下步骤:1. 数据清洗:对原始数据进行预处理,包括去除噪声、填补缺失值、消除重复值等。

2. 数据处理:对数据进行转换、规范化、归一化等操作,使数据符合特定算法的要求。

3. 数据分析:对数据进行分析,找出异常值、缺失值、重复值等不完整或不准确的数据。

三、实验内容1. 实验数据:本次实验选用某电商平台销售数据作为实验数据,包括用户ID、商品ID、购买数量、购买时间、用户评价等字段。

2. 实验工具:Python编程语言、Pandas库、NumPy库、Scikit-learn库等。

3. 实验步骤:(1)数据导入:使用Pandas库读取实验数据。

(2)数据清洗:检查数据是否存在缺失值、重复值,对缺失值进行填补,删除重复值。

(3)数据处理:对购买数量、购买时间等字段进行转换、规范化、归一化等操作。

(4)数据分析:使用Scikit-learn库进行数据分析,找出异常值、缺失值、重复值等。

四、实验结果与分析1. 数据清洗在数据清洗过程中,发现以下问题:(1)用户ID存在缺失值,共10条记录,采用随机填充法进行填补。

(2)商品ID存在重复值,共5条记录,采用删除重复值的方法进行处理。

2. 数据处理在数据处理过程中,对购买数量、购买时间等字段进行以下操作:(1)购买数量:将购买数量进行归一化处理,使数据符合算法要求。

(2)购买时间:将购买时间转换为时间戳,便于后续分析。

3. 数据分析在数据分析过程中,使用Scikit-learn库进行以下操作:(1)异常值检测:使用Z-score方法检测购买数量、购买时间等字段的异常值,共检测到5条异常记录,将其删除。

Java实验报告(回文数-applet)

Java实验报告(回文数-applet)

Java实验报告1.编程:编写一个applet,输入一个数,判断输入的这个数是否为回文数。

所谓回文数就是从左向右看和从右向左看都一样。

例如,121,13431都是回文数,而12345不是回文数。

分析步骤:step1:开始。

step2:从用户端输入一个数。

step3:判断它是否从左向右看和从右向左看都一样。

step4:若是,则为回文数;若否,则不是回文数step5:将step4结果显示在小窗口上。

step6:结束。

Code:packagetimu;importjava.applet.Applet;importjava.awt.*;public class NewApplet extends Applet {Label lab;TextField input;int x;public void init() {lab=new Label("输入一个数");input=new TextField(10);add(lab);add(input);}publicboolean action (Event e,Object o){x=Integer.parseInt(input.getText());int y=10,i=1;intnum=x,b=x;while(x/y>0){x=x/y;i++;} // end for 找出此数是几位数int store[]=new int[i];for(int j=0;j<i;j++){store[j]=num%10;num=num/10;} //将每位数储存到store数组中inttruetime=0;for(int n=0;n<(i+1)/2;n++){if(store[n]==store[i-1-n])truetime++;elsebreak;}if(truetime==(i+1)/2) //通过测试正确次数类比较是否是回文数showStatus("是回文数");elseshowStatus("不是回文数");return true;}// end action}显示结果:不是回文数的情况是回文数的情况2.编程:产生20个int类型的随机数,针对每个数使用if-then-else判断它是大于、小于或等于下一个数(注意:最后一个数不参与比较)。

算法——回文(palindrome)

算法——回文(palindrome)

算法——回⽂(palindrome)回⽂(palindrome):指的是从头读到尾与从尾读到头⼀模⼀样的字符串。

分别在C、Java与Python实现回⽂检测:C:#include <stdio.h>#include <stdbool.h>#include <ctype.h>#define MAX_LEN 255int main(int argc, char *args[]){char message[MAX_LEN];char str[MAX_LEN];char ch;int index = 0;printf("Please enter a message: ");while((ch = getchar()) != '\n'){if(index==MAX_LEN){while(getchar() != '\n'){continue;}break;}else{message[index++] = ch;}}int j = 0;for(int i = 0; i < index; i++){ch = message[i];if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')){str[j++] = tolower(ch);}}for(int i = 0; i < j / 2; i++){if(str[i] != str[j-i-1]){puts("Not a Palindrome!");return1;}}puts("Palindrome!");return0;}Java:import java.util.Scanner;public class Palindrome{public static boolean isPalindrome(String raw){String str = "";// 只拿raw字符串⾥的字母,拼接到str⾥for(int i = 0; i < raw.length(); i++){char ch = raw.charAt(i);if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')){str += ch;}}// str字母全部⼩写化str = str.toLowerCase();// 判断是否为回⽂int end = str.length();for(int i = 0; i < end/2; i++){if(str.charAt(i) != str.charAt(end-i-1)){return false;}}return true;}public static void main(String[] args){Scanner scanner = new Scanner(System.in);// I prefer pi!// A man, a plan, a canal: Panama!// Madam, I am Adam.System.out.printf("Enter a message: ");String str = scanner.nextLine();if(isPalindrome(str)){System.out.println("Palindrome!");}else{System.out.println("Not a palindrome!");}}}Python:import stringdef is_palindrome(text: str) -> bool:'是否为回⽂'# 1、先去除标点符号以及空格,并将所有字母⼩写化 result = ''for i in range(len(text)):if not text[i] in string.punctuation + '':result += text[i].lower()print(result)# 2、判断是否为回⽂n = len(result)for i in range(len(result) // 2):if result[i] != result[n-i-1]:return Falsereturn Trueif__name__ == '__main__':print(is_palindrome('I prefer pi.'))print(is_palindrome('A man, a plan, a canal: Panama.')) print(is_palindrome('Resistance is futile!'))。

数学实验报告 关于回文数产生数的检验

数学实验报告  关于回文数产生数的检验

数学实验报告姓名:班级:学号:指导老师:1.实验题目:对于一个自然数,若将各位数字倒序排出,加到原来的数字上,反复这样多次后,若能得到一个从左到右读与从右到左读完全一样的数,则称该自然数能产生回文数或者对称数,例如:195就可以产生一个回文数9339,因为195+591=786786+687=14731473+3741=52145214+4125=9339通过编程计算,你能找出多少个能产生回文数的数,又能找出多少个不能产生回文数的数?二者的最小数是多少?注:由于每个自然数可以进行无穷次循环计算,因此不能判定一个自然数进行无穷次计算后一定能或不能产生回文数,所以本次实验中只判定在一万次的循环计算后能否产生回文数。

2.Matlab程序源代码:j=input('请输入测试数上限:')for m=0:1:jnum=m;fprintf('num:%d\n',m);n=0;for h=0:1:10000i=1;jilu=0;while (num/i)>=1;i=i*10;jilu=jilu+1;endi=10;xinshu=0;bianliang=num;while jilu>=1;a=mod(bianliang,i);bianliang=(bianliang-a)/10;xinshu=xinshu+a*10^(jilu-1);jilu=jilu-1;endnum=num+xinshu;i=1;jilu=0;while (num/i)>=1;i=i*10;jilu=jilu+1;endi=10;xinshu=0;bianliang=num;while jilu>=1;a=mod(bianliang,i);bianliang=(bianliang-a)/10;xinshu=xinshu+a*10^(jilu-1);jilu=jilu-1;endif xinshu-num==0n=1;fprintf('原自然数能产生回文数\n');break;endendif n==0;fprintf('原自然数在一万步运算内不能产生回文数\n'); endend3.程序运行结果:注:M文件的文件名为“zhuanhuan”>> zhuanhuan请输入测试数上限:200 j =200num:0原自然数能产生回文数num:1原自然数能产生回文数num:2原自然数能产生回文数num:3原自然数能产生回文数num:4原自然数能产生回文数num:5原自然数能产生回文数num:6原自然数能产生回文数num:7 原自然数能产生回文数num:8原自然数能产生回文数num:9原自然数能产生回文数num:10原自然数能产生回文数num:11原自然数能产生回文数num:12原自然数能产生回文数num:13原自然数能产生回文数num:14原自然数能产生回文数num:15原自然数能产生回文数num:16原自然数能产生回文数num:17原自然数能产生回文数num:18原自然数能产生回文数num:19原自然数能产生回文数num:20原自然数能产生回文数num:21原自然数能产生回文数num:22原自然数能产生回文数num:23原自然数能产生回文数num:24原自然数能产生回文数num:25原自然数能产生回文数num:26原自然数能产生回文数num:27原自然数能产生回文数num:28原自然数能产生回文数num:29num:30原自然数能产生回文数num:31原自然数能产生回文数num:32原自然数能产生回文数num:33原自然数能产生回文数num:34原自然数能产生回文数num:35原自然数能产生回文数num:36原自然数能产生回文数num:37原自然数能产生回文数num:38原自然数能产生回文数num:39原自然数能产生回文数num:40原自然数能产生回文数num:41原自然数能产生回文数num:42原自然数能产生回文数num:43原自然数能产生回文数num:44原自然数能产生回文数num:45原自然数能产生回文数num:46原自然数能产生回文数num:47原自然数能产生回文数num:48原自然数能产生回文数num:49原自然数能产生回文数num:50原自然数能产生回文数num:51 num:52原自然数能产生回文数num:53原自然数能产生回文数num:54原自然数能产生回文数num:55原自然数能产生回文数num:56原自然数能产生回文数num:57原自然数能产生回文数num:58原自然数能产生回文数num:59原自然数能产生回文数num:60原自然数能产生回文数num:61原自然数能产生回文数num:62原自然数能产生回文数num:63原自然数能产生回文数num:64原自然数能产生回文数num:65原自然数能产生回文数num:66原自然数能产生回文数num:67原自然数能产生回文数num:68原自然数能产生回文数num:69原自然数能产生回文数num:70原自然数能产生回文数num:71原自然数能产生回文数num:72原自然数能产生回文数num:73num:74原自然数能产生回文数num:75原自然数能产生回文数num:76原自然数能产生回文数num:77原自然数能产生回文数num:78原自然数能产生回文数num:79原自然数能产生回文数num:80原自然数能产生回文数num:81原自然数能产生回文数num:82原自然数能产生回文数num:83原自然数能产生回文数num:84原自然数能产生回文数num:85原自然数能产生回文数num:86原自然数能产生回文数num:87原自然数能产生回文数num:88原自然数能产生回文数num:89原自然数能产生回文数num:90原自然数能产生回文数num:91原自然数能产生回文数num:92原自然数能产生回文数num:93原自然数能产生回文数num:94原自然数能产生回文数num:95num:96原自然数能产生回文数num:97原自然数能产生回文数num:98原自然数能产生回文数num:99原自然数能产生回文数num:100原自然数能产生回文数num:101原自然数能产生回文数num:102原自然数能产生回文数num:103原自然数能产生回文数num:104原自然数能产生回文数num:105原自然数能产生回文数num:106原自然数能产生回文数num:107原自然数能产生回文数num:108原自然数能产生回文数num:109原自然数能产生回文数num:110原自然数能产生回文数num:111原自然数能产生回文数num:112原自然数能产生回文数num:113原自然数能产生回文数num:114原自然数能产生回文数num:115原自然数能产生回文数num:116原自然数能产生回文数num:117 num:118原自然数能产生回文数num:119原自然数能产生回文数num:120原自然数能产生回文数num:121原自然数能产生回文数num:122原自然数能产生回文数num:123原自然数能产生回文数num:124原自然数能产生回文数num:125原自然数能产生回文数num:126原自然数能产生回文数num:127原自然数能产生回文数num:128原自然数能产生回文数num:129原自然数能产生回文数num:130原自然数能产生回文数num:131原自然数能产生回文数num:132原自然数能产生回文数num:133原自然数能产生回文数num:134原自然数能产生回文数num:135原自然数能产生回文数num:136原自然数能产生回文数num:137原自然数能产生回文数num:138原自然数能产生回文数num:139num:140原自然数能产生回文数num:141原自然数能产生回文数num:142原自然数能产生回文数num:143原自然数能产生回文数num:144原自然数能产生回文数num:145原自然数能产生回文数num:146原自然数能产生回文数num:147原自然数能产生回文数num:148原自然数能产生回文数num:149原自然数能产生回文数num:150原自然数能产生回文数num:151原自然数能产生回文数num:152原自然数能产生回文数num:153原自然数能产生回文数num:154原自然数能产生回文数num:155原自然数能产生回文数num:156原自然数能产生回文数num:157原自然数能产生回文数num:158原自然数能产生回文数num:159原自然数能产生回文数num:160原自然数能产生回文数num:161原自然数能产生回文数num:162原自然数能产生回文数num:163原自然数能产生回文数num:164原自然数能产生回文数num:165原自然数能产生回文数num:166原自然数能产生回文数num:167原自然数能产生回文数num:168原自然数能产生回文数num:169原自然数能产生回文数num:170原自然数能产生回文数num:171原自然数能产生回文数num:172原自然数能产生回文数num:173原自然数能产生回文数num:174原自然数能产生回文数num:175原自然数能产生回文数num:176原自然数能产生回文数num:177原自然数能产生回文数num:178原自然数能产生回文数num:179原自然数能产生回文数num:180原自然数能产生回文数num:181原自然数能产生回文数num:182原自然数能产生回文数num:183原自然数能产生回文数num:184原自然数能产生回文数num:185原自然数能产生回文数num:186原自然数能产生回文数num:187原自然数能产生回文数num:188原自然数能产生回文数num:189原自然数能产生回文数num:190原自然数能产生回文数num:191原自然数能产生回文数num:192原自然数能产生回文数num:193原自然数能产生回文数num:194原自然数能产生回文数num:195原自然数能产生回文数num:196原自然数在一万步运算内不能产生回文数num:197原自然数能产生回文数num:198原自然数能产生回文数num:199原自然数能产生回文数num:200原自然数能产生回文数>>注:上述实验结果实际为一列现实,为使实验报告更加简洁,复制到word中后设置为分三栏显示。

回文数字的定义-概念解析以及定义

回文数字的定义-概念解析以及定义

回文数字的定义-概述说明以及解释1.引言1.1 概述回文数字是一种特殊的数字形式,在现今数学和计算领域中具有重要意义。

回文数字是指从左到右和从右到左读取数字结果相同的数,也就是它在十进制下的表示方式是对称的。

例如,121和1221都是回文数字,因为它们从左到右和从右到左读取数字结果相同。

回文数字不仅在数学领域中具有重要意义,在计算机科学、密码学和信息安全等领域也有广泛的应用。

通过深入研究回文数字的性质和特点,可以帮助我们更好地理解数字之间的关系,优化算法设计,加强数据安全等方面的应用。

本文将深入探讨回文数字的概念、特点和应用,以及回顾回文数字的意义和展望回文数字的未来发展。

通过对回文数字的综合分析,可以更好地认识回文数字在数学和计算领域中的重要性和作用,促进相关领域的学术交流和技术创新。

文章结构部分的内容如下:1.2 文章结构本文分为引言、正文和结论三个部分。

在引言部分中,将简要介绍回文数字的概念并说明目的,以引出文章的主题。

在正文部分,将详细论述回文数字的概念、特点和应用。

在结论部分,将总结回文数字的重要性,并展望未来的发展方向。

整篇文章将围绕着回文数字展开,在严谨的逻辑结构下,深入探讨回文数字在数学和实际应用中的重要性。

1.3 目的:本文的目的是对回文数字进行全面的定义和解释,探讨其在数学和现实生活中的重要性和应用。

通过本文的阐述,读者可以更深入地了解回文数字的概念、特点以及其在数学领域和实际生活中的应用,进而增强对回文数字的理解和认识。

同时,通过对回文数字的重要性、意义和未来发展的展望,希望能够激发读者对数学研究的兴趣,促进相关领域的进步和发展。

最终,本文旨在为读者提供全面而深入的了解回文数字的知识,以及对其重要性和未来发展的思考。

2.正文2.1 回文数字的概念回文数字是指从左向右读和从右向左读都相同的数字。

换句话说,如果一个数字的各个位数依次排列,无论从左往右还是从右往左读都是一样的,那么这个数字就被称为回文数字。

实验报告——栈和队列的应用

实验报告——栈和队列的应用

实验报告——栈和队列的应用第一篇:实验报告——栈和队列的应用实验5 栈和队列的应用目的和要求:(1)熟练栈和队列的基本操作;(2)能够利用栈与队列进行简单的应用。

一、题目题目1.利用顺序栈和队列,实现一个栈和一个队列,并利用其判断一个字符串是否是回文。

所谓回文,是指从前向后顺读和从后向前倒读都一样的字符串。

例如,a+b&b+a等等。

题目2.假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队。

跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴。

若两队初始人数不相同,则较长的那一队中未配对者等待下一轮舞曲。

现要求写一算法模拟上述舞伴配对问题,并实现。

题目3.打印机提供的网络共享打印功能采用了缓冲池技术,队列就是实现这个缓冲技术的数据结构支持。

每台打印机具有一个队列(缓冲池),用户提交打印请求被写入到队列尾,当打印机空闲时,系统读取队列中第一个请求,打印并删除之。

请利用队列的先进先出特性,完成打印机网络共享的先来先服务功能。

题目4.假设以数组Q[m]存放循环队列中的元素, 同时设置一个标志tag,以tag == 0和tag == 1来区别在队头指针(front)和队尾指针(rear)相等时,队列状态为“空”还是“满”。

试编写与此结构相应的插入(enqueue)和删除(dlqueue)算法。

题目5.利用循环链队列求解约瑟夫环问题。

请大家从本组未讨论过的五道题中选择一道,参照清华邓俊辉老师MOOC视频及课本相关知识,编写相应程序。

选择题目3:打印机提供的网络共享打印功能采用了缓冲池技术,队列就是实现这个缓冲技术的数据结构支持。

二、程序清单//Ch3.cpp #include #include #include“ch3.h” template void LinkedQueue::makeEmpty()//makeEmpty//函数的实现{ LinkNode*p;while(front!=NULL)//逐个删除队列中的结点{p=front;front=front->link;delete p;} };template bool LinkedQueue::put_in(T&x){//提交命令函数if(front==NULL){//判断是否为空front=rear=new LinkNode;//如果为空,新结点为对头也为对尾front->data=rear->data=x;if(front==NULL)//分配结点失败return false;} else{rear->link=new LinkNode;//如不为空,在链尾加新的结点rear->link->data=x;if(rear->link==NULL)return false;rear=rear->link;} return true;};template bool LinkedQueue::carry_out()//执行命令函数 { if(IsEmpty()==true)//判断是否为空{return false;} cout<data<LinkNode*p=front;front=front->link;//删除以执行的命令,即对头修改delete p;//释放原结点return true;};void main()//主函数 { LinkedQueue q;//定义类对象char flag='Y';//标志是否输入了命令const int max=30;//一次获取输入命令的最大个数while(flag=='Y')//循环{ int i=0;char str[max];//定义存储屏幕输入的命令的数组gets(str);//获取屏幕输入的命令while(str[i]!=''){q.put_in(str[i]);//调用提交命令函数,将每个命令存入队列中i++;}for(int j=0;j<=i;j++){if(q.IsEmpty()==true)//判断是否为空,为空则说明没有可执行的命令{cout<cin>>flag;continue;//为空跳出for循环为下次输入命令做好准备}q.carry_out();//调用执行命令的函数,将命令打印并删除}三、程序调试过程中所出现的错误无。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《数据结构》实验报告书实验内容:栈和队列的基本操作及其应用计算机学院计算机科学与技术计科:**********前言计算机编程中加工处理的对象是数据,而数据具有一定的组织结构,所以学习计算机编程仅仅了解计算机语言是不够的,还必须掌握数据的组织、存储和运算的一般方法,这便是数据结构课程中所研究的内容,也是我们编写计算机程序的重要基础,由于它对计算机学科起到承前启后的作用,因此本课程被列为计算机等相关专业最重要的专业基础课;同时数据结构是计算机专业教学的一门核心课程。

计算机各领域都要用到各种数据结构,而且要从事计算机科学与技术工作,尤其是计算机领域的软件开发工作,必须具备较强的数据结构基础。

数据结构课程内容丰富、学习量大,实践性强;隐含在各部分内容中的方法和技术多;算法设计具有动态性和抽象性等特点,看懂听明白与掌握会应用之间有相当大的一段距离。

所以学生必须多实践才能进一步加深对课程的理解,理解和掌握算法设计所需的方法和技术,为整个专业学习打下良好的基础。

栈和队列的基本操作及其应用回文判断一、实验目的1、掌握栈和队列的顺序存储结构和链式存储结构,以便在实际中灵活应用。

2、掌握栈和队列的特点,即后进先出和先进先出的原则。

3、掌握栈和队列的基本运算,如:入栈与出栈,入队与出队等运算在顺序存储结构和链式存储结构上的实现。

[问题描述]对于一个从键盘输入的字符串,判断其是否为回文。

回文即正反序相同。

如“abba”是回文,而“abab”不是回文。

[基本要求](1)数据从键盘读入;(2)输出要判断的字符串;(3)利用栈的基本操作对给定的字符串判断其是否是回文,若是则输出“Yes”,否则输出“No”。

[测试数据]由学生任意指定。

算法设计:首先,先建立两个空栈。

分别命名为S、L。

现将输入的字符串,储存于S栈中。

然后,编写代码。

使得S栈中的字符依出栈,并保存于L栈中。

这样可以使得S 栈与L栈中的字符完全相同,但顺序颠倒。

然后依次比较L栈与S栈中的字符是否相同。

如果相同,则说明,所输入的字符。

颠倒顺序后与原字符依然相同。

所以可判断为回文。

否则,就不是回文。

在本代码中,栈的数据结构设计了三个指针。

base指向栈底,top指向栈顶,sel也指向栈顶。

sel的作用是用于将栈S 中的元素,依次传给栈L。

从而避免了,在传元素的过程中,栈S的top指针回到base指针上。

导致栈S变为空栈。

最后说明一下。

字符串的输入是一“#”字符为结束标志的。

但这个符号本身不算字符串的一部分。

建立堆栈的数据结构:typedef struct Stick{ele *base;ele *top;ele *sel;int stacksize;}Sqstack;当然此处定义:typedef char ele;初始化所有可能用到的数据:#define NULL 0#define SIZE 100#define OVER 100堆栈的建立算法:i nt Init(Sqstack &S){S.base=(ele *)malloc(SIZE * sizeof(ele));if(!S.base) exit(0);S.top=S.base;S.sel=S.base;S.stacksize=SIZE;return 1;}堆栈的建立好以后就可以想法向里面输入字符,并定义以下算法实现向堆栈里面输入字符:int push(Sqstack &S,ele e){if (S.top-S.base>=S.stacksize){S.base=(ele *)realloc(S.base,(S.stacksize+OVER)*sizeof(ele));if(!S.base) exit(0);S.top=S.base+S.stacksize;S.stacksize=S.stacksize+OVER;}*S.top++=e;S.sel=S.top;return 1;}此程序是为实现回文的判断定义以下实现函数comp(Sqstack &S,Sqstack&L):int comp(Sqstack &S,Sqstack &L) //对两个堆栈中的字符串进行比较并判断是否为回文{int n=1;if (L.top-L.base>=L.stacksize){L.base=(ele *)realloc(L.base,(L.stacksize+OVER)*sizeof(ele));if(!L.base) exit(0);L.top=L.base+S.stacksize;L.stacksize=L.stacksize+OVER;}S.sel=S.sel-1;while(S.sel>=S.base){*L.top=*S.sel;S.sel=S.sel-1;L.top =L.top+1;}S.top=S.top-2;L.top=L.top-1;while((S.top>=S.base)&&(L.top>=L.base-1)){if(*S.top!=*L.top)n=0;S.top--;L.top--;}if(n==1){cout<<"YES\n";}elsecout<<"NO\n";return OK;}此函数是本程序的核心所以,主要进行的操作就是本函数。

主函数:void main(){char j;Sqstack S,L;Init(S);Init(L);cout<<"请输入以“#”结尾的字符:\n";cin>>j;push(S,j);while(j!='#'){cin>>j;push(S,j);}cout<<"\n";comp(S,L);cout<<"\n";system("pause");}测试调试:本程序开始运行后出现以下界面:根据具体所析:采用以下测试数据,以字母回文、字母非回文、数字回文、数字非回文、字母加数字回文、字母加数字非回文,进行测试:asdfnmmnfdsa、imksginlkjii、25468986452、23556964、aki56265ika、sdfs5548。

所有测试数据以“#”结尾。

测试一:成功。

测试二:成功。

测试三:成功。

测试四:成功。

测试五:成功。

测试六:成功。

总结:经过以上的编码测试,可以得出,本实验程序能对字符进行是否为回文的判断。

并最终以YESor No 的形式把结果给输入。

能过本次实验,我算是深入的了解了堆栈的操作及应用,虽然此程序很小,但已足以氢栈的思想给表现,并通过本次实验,熟悉了栈的知识,并在以后的学习当中并加以应用。

最后感谢指导老师:高老师附录:源代码:#include<iostream>#include<stdlib.h>using namespace std;#define NULL 0 //初始化所有可能用到的参数#define SIZE 100#define OVER 100#define OK 1typedef char ele;typedef struct Stick //建立堆栈的数据结构{ele *base;ele *top;ele *sel;int stacksize;}Sqstack;int Init(Sqstack &S) //建立一个堆栈{S.base=(ele *)malloc(SIZE * sizeof(ele));if(!S.base) exit(0);S.top=S.base;S.sel=S.base;S.stacksize=SIZE;return OK;}int push(Sqstack &S,ele e) //向堆栈里输入字符{if (S.top-S.base>=S.stacksize){S.base=(ele *)realloc(S.base,(S.stacksize+OVER)*sizeof(ele));if(!S.base) exit(0);S.top=S.base+S.stacksize;S.stacksize=S.stacksize+OVER;}*S.top++=e;S.sel=S.top;return OK;}int comp(Sqstack &S,Sqstack &L) //对两个堆栈中的字符串进行比较并判断是否为回文{int n=1;if (L.top-L.base>=L.stacksize){L.base=(ele *)realloc(L.base,(L.stacksize+OVER)*sizeof(ele));if(!L.base) exit(0);L.top=L.base+S.stacksize;L.stacksize=L.stacksize+OVER;}S.sel=S.sel-1;while(S.sel>=S.base){*L.top=*S.sel;S.sel=S.sel-1;L.top =L.top+1;}S.top=S.top-2;L.top=L.top-1;while((S.top>=S.base)&&(L.top>=L.base-1)) {if(*S.top!=*L.top)n=0;S.top--;L.top--;}if(n==1){cout<<"YES\n";}elsecout<<"NO\n";return OK;}void main(){char j;Sqstack S,L;Init(S);Init(L);cout<<"请输入以“#”结尾的字符:\n";cin>>j;push(S,j);while(j!='#'){cin>>j;push(S,j);}cout<<"\n";comp(S,L);cout<<"\n";system("pause"); }。

相关文档
最新文档