当前位置:   article > 正文

数据结构实验:回文判断_数据结构回文判断编程

数据结构回文判断编程

一、实验目的

通过该实验,掌握栈的相关基本概念,认识栈是插入和删除集中在一端进行的线性结构,掌握栈的“先入后出”操作特点。

栈在进行各类操作时,栈底指针固定不动,掌握栈空、栈满的判断条件。

二、实验题目

(一)二选一

①建立一个顺序栈,实现进栈、出栈操作。

②建立一个链队列,实现入队、出队操作。

(二)回文判断

回文,指正读和反读都相同的字符序列,称为“回文”序列。

从键盘以此读入一个以@为结束符的字符序列,判断此序列是否为形如“序列1 & 序列2”模式的字符序列。其中序列1和序列2中都不含字符“&”,而且序列2是序列1的逆序列。例如,字符序列“a+b&b+a”是属于该模式的序列,而“1+3&3-1”则不是回文。

要求设计一个程序,利用栈或者队列模拟此过程,判断输入的字符序列是否为回文,并将判断结果输出。

三、问题分析

1.数据分析

定义栈Stack用作存放输入的字符

定义存放输入字符栈的栈s

定义输入的字符为ch

当字符从栈中弹出时,使用temp暂存

2.运算分析

预处理指令:初始化栈、入栈、出栈、判断栈是否为空

InitStack(&s)-初始化栈s

getchar单个输入字符

当ch不为字符&时,压入栈s,循环输入字符

3.主要算法分析

当ch不为字符@并且栈s不为空时,将&后输入的字符与之前压入栈中的字符依次循环判断是否对应相等

如果&后新输入的字符与栈s弹出的字符不依次对应相等,输出序列1与序列2不相同,返回FALSE*

栈为空时并且输入的下一个字符为@时,说明序列1与序列2相同,反之不同

4.测试数据分析

字符序列“a+b&b+a”是属于该模式的序列,而“1+3&3-1”则不是回文

四、源程序

  1. #include <stdio.h>
  2. #define TRUE 1
  3. #define FALSE 0
  4. typedef struct {
  5.     char elem[100];
  6.     int top;
  7. }Stack;
  8. void InitStack(Stack* s);
  9. int Push(Stack* s, char e);
  10. int Pop(Stack* s, char* x);
  11. int IsEmpty(Stack* s);
  12. int main() {
  13.     Stack s;
  14.     char ch;
  15.     char temp;
  16.     InitStack(&s);
  17.     printf("\n请输入以@为结尾的字符序列:");
  18.     ch = getchar();
  19.     while (ch != '&') {
  20.         Push(&s, ch);
  21.         ch = getchar();
  22.     }
  23.     do {
  24.         ch = getchar();
  25.         Pop(&s, &temp); 
  26.         if (ch != temp) {
  27.             printf("\n序列1与序列2不相同");
  28.              return(FALSE);
  29.         }
  30.     } while (ch != '@' && !IsEmpty(&s));
  31.     ch = getchar();
  32.     if (ch == '@' && IsEmpty(&s)) {
  33.         printf("\n序列1与序列2相同");
  34.         return(TRUE);
  35.     }
  36.     else {
  37.         printf("\n序列1与序列2不相同");
  38.         return(FALSE);
  39.     }
  40. }
  41. void InitStack(Stack* s) {
  42.     s->top = -1;
  43. }
  44. int Push(Stack* s, char e) {
  45.     if (s->top != 99) {
  46.         (s->top)++;
  47.         s->elem[s->top] = e;
  48.     }
  49.     else
  50.         return (FALSE);
  51. }
  52. int Pop(Stack* s, char* x) {
  53.     if (s->top != -1) {
  54.         *x = s->elem[s->top];
  55.         s->top--;
  56.         return(TRUE);
  57.     }
  58.     else
  59.         return(FALSE);
  60. }
  61. int IsEmpty(Stack* s) {
  62.     if (s->top == -1)
  63.         return(TRUE);
  64.     return(FALSE);
  65. }

五、运行结果及分析

字符序列“a+b&b+a”形如“序列1 & 序列2,而“1+3&3-1”则不是回文

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/934802
推荐阅读
相关标签
  

闽ICP备14008679号