1,设计一个算法利用顺序栈的基本运算判断一个字符串是否是回文
解题思路:
      由于回文是从前到后和从后到前读都是一样的,所以只要将待判断的字符串颠倒
然后与原字符串相比较,就可以决定是否是回文了

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #define MaxSize 100 //顺序栈的初始分配大小
  4. typedef struct SqStack {
  5. char data[MaxSize];//保存栈中元素
  6. int top;//栈中指针
  7. }SqStack;
  8.  
  9. //声明初始化方法
  10. void initStack(SqStack &st);
  11. //声明压栈方法
  12. int Push(SqStack &st, char x);
  13. //声明出栈方法
  14. int Pop(SqStack &st, char &x);
  15. //判断是否为空
  16. int StackEmpty(SqStack st);
  17. //声明判断是否是回文的方法
  18. int isPalindrome(char str[]);
  19. int main() {
  20. char str[] = "abcdcba";
  21. printf("是否是回文?1(是):0(不是)= %d \n", isPalindrome(str));
  22. return ;
  23. }
  24. //实现方法
  25. //初始化
  26. void initStack(SqStack &st) {//st为引用型参数
  27. st.top = -;
  28. }
  29. //压栈
  30. int Push(SqStack &st, char x) {
  31. if (st.top==MaxSize-) {//栈满,上溢出,返回0
  32. return ;
  33. }
  34. else {
  35. st.top++;
  36. st.data[st.top] = x;
  37. return ;//成功进栈返回1
  38. }
  39. }
  40. //出栈
  41. int Pop(SqStack &st, char &x) { //x为引用型参数
  42. if (st.top == -) {
  43. return ;
  44. }
  45. else {
  46. x = st.data[st.top];
  47. st.top--;
  48. return ;//成功出栈返回1
  49. }
  50. }
  51.  
  52. //判断是否为空
  53. int StackEmpty(SqStack st) {
  54. if (st.top == -)return ;
  55. else return ;
  56. }
  57.  
  58. //判定一个给定字符串str是否是回文,是返回1 不是返回0
  59. int isPalindrome(char str[]) {
  60. SqStack st;//定义一个顺序栈st
  61. initStack(st);//栈初始化
  62. int i = ;
  63. char ch;
  64. while ((ch=str[i++])!='\0') //所有字符串一次进栈
  65. Push(st,ch);
  66. i = ;//从头开始遍历str
  67.  
  68. while (!StackEmpty(st)) {
  69. Pop(st,ch);
  70. if (ch!=str[i++]) {//两字符不相同时返回0
  71. //销毁栈返回0
  72. return ;
  73. }
  74. }
  75. return ;//所有字符都相同返回1
  76. }

例2:设计一个算法,判断一个可能包含有小括号(“(”,“)”),中括号(“[”,“]”),大括号(“{”,“}”)的表达式中各类括号是否匹配,若匹配返回1,不匹配返回0
     解题思路:

设置一个栈st(使用字符数组存放栈中元素,再用一个整型变量top 作为栈顶指针)用i扫描表达式,忽略非括号字符,当遇到左括号“(”,”[","{",时,将其入栈,
遇到 } ] )时,判断栈顶是否相匹配的括号,若不是退出扫描,返回0,负责扫描完毕,若栈空则返回1,否则返回0;

  1. #include <stdio.h>
  2. #define MaxSize 100
  3. int match(char *exps) //exps存放表达式
  4. { char st[MaxSize];
  5. int nomatch=,top=-,i=;
  6. while (exps[i]!='\0' && nomatch==)//遍历表达式exps
  7. { switch(exps[i])
  8. {
  9. case '(': case '[': case '{': //左括号进栈
  10. top++;st[top]=exps[i];break;
  11. case ')': //判断栈顶是否为'('
  12. if (st[top]=='(') top--;
  13. else nomatch=;
  14. break;
  15. case ']': //判断栈顶是否为'['
  16. if (st[top]=='[') top--;
  17. else nomatch=;
  18. break;
  19. case '}': //判断栈顶是否为'{'
  20. if (st[top]=='{') top--;
  21. else nomatch=;
  22. break;
  23. default: //跳过其他字符
  24. break;
  25. }
  26. i++;
  27. }
  28. if (nomatch== && top==-) //栈空且符号匹配则返回1
  29. return ;
  30. else
  31. return ; //否则返回0
  32. }
  33. void main()
  34. {
  35. char str1[]="[(])";
  36. char str2[]="[()]";
  37. char str3[]="[()])";
  38. char str4[]="([()]";
  39. printf("判断结果如下:\n");
  40. if (match(str1))
  41. printf(" %s是匹配的表达式\n",str1);
  42. else
  43. printf(" %s不是匹配的表达式\n",str1);
  44. if (match(str2))
  45. printf(" %s是匹配的表达式\n",str2);
  46. else
  47. printf(" %s不是匹配的表达式\n",str2);
  48. if (match(str3))
  49. printf(" %s是匹配的表达式\n",str3);
  50. else
  51. printf(" %s不是匹配的表达式\n",str3);
  52. if (match(str4))
  53. printf(" %s是匹配的表达式\n",str4);
  54. else
  55. printf(" %s不是匹配的表达式\n",str4);
  56.  
  57. }

例3:设计一个算法,将一个十进制正整数转换为相应的二进制数;

解题思路:

将十进制数转化为2进制数,通常才用除2取余法,在转换过程中,二进制数是从低位到高位的次序得到的,这和通常的从高位到低位输出相反,

为此设计一个栈,用于暂时存放每次得到的余数,当转换过程结束时,退栈所有元素便得到从高位到低位的二进制数,如下演示:

实现:

  1. #include <stdio.h>
  2. #define MaxSize 100
  3. void trans(int d, char b[]) //b用于存放d转换成的二进制数的字符串
  4. {
  5. char st[MaxSize], ch;
  6. int i = , top = -; //栈顶指针top初始为-1
  7. while (d != )
  8. {
  9. ch = '' + d % ; //求余数并转换为字符
  10. top++; st[top] = ch; //字符ch进栈
  11. d /= ; //继续求更高位
  12. }
  13. while (top != -)
  14. {
  15. b[i] = st[top];
  16. top--; //出栈并存放在数组b中
  17. i++;
  18. }
  19. b[i] = '\0'; //加入字符串结束标志
  20. }
  21.  
  22. void main()
  23. {
  24. int d;
  25. char str[MaxSize];
  26. do
  27. {
  28. printf("输入一个正整数:");
  29. scanf("%d", &d);
  30. } while (d<);
  31. trans(d, str);
  32. printf("对应的二进制数:%s\n", str);
  33.  
  34. }

在较复杂的数据处理中,通常需要保存多个需要临时产生的数据,如果先产生的数据先处理,那么需要用队列来处理这些数据;

综合:设计一个算法,反映病人到医院看病,排队看医生的过程:

描述:病人排队看医生,采用先到先看的方式,所以要用到队列,由于病人人数具有较大的不确定性,这里采用一个带头结点的单链表作为队列的存储结构,为了简单,

病人通过其姓名来唯一标识,如下病人队列:

实现如下:

  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #include <string.h>
  4. typedef struct Lnode
  5. { char data[]; //存放患者姓名
  6. struct Lnode *next; //指针域
  7. } QType; //链队结点类型
  8. typedef struct
  9. { QType *front; //指向队头病人结点
  10. QType *rear; //指向队尾病人结点
  11. } LQueue; //病人链队类型
  12. //---初始化队列运算算法---
  13. void InitQueue(LQueue *&lq)
  14. { lq=(LQueue *)malloc(sizeof(LQueue));
  15. lq->rear=lq->front=NULL; //初始时队头和队尾指针均为空
  16. }
  17. //----销毁链队----
  18. void DestroyQueue(LQueue *&lq)
  19. { QType *pre=lq->front,*p;
  20. if (pre!=NULL) //非空队的情况
  21. { if (pre==lq->rear) //只有一个数据结点的情况
  22. free(pre); //释放*pre结点
  23. else //有两个或多个数据结点的情况
  24. { p=pre->next;
  25. while (p!=NULL)
  26. { free(pre); //释放*pre结点
  27. pre=p; p=p->next; //pre、p同步后移
  28. }
  29. free(pre); //释放尾结点
  30. }
  31. free(lq); //释放链队结点
  32. }
  33. }
  34. //----进队运算算法----
  35. void EnQueue(LQueue *&lq,char x[])
  36. { QType *s;
  37. s=(QType *)malloc(sizeof(QType)); //创建新结点,插入到链队的末尾
  38. strcpy(s->data,x);s->next=NULL;
  39. if (lq->front==NULL) //原队为空队的情况
  40. lq->rear=lq->front=s; //front和rear均指向*s结点
  41. else //原队不为空队的情况
  42. { lq->rear->next=s; //将*s链到队尾
  43. lq->rear=s; //rear指向它
  44. }
  45. }
  46. //-----出队运算算法-----
  47. int DeQueue(LQueue *&lq,char x[])
  48. { QType *p;
  49. if (lq->front==NULL) //原队为空队的情况
  50. return ;
  51. p=lq->front; //p指向队头结点
  52. strcpy(x,p->data); //取队头元素值
  53. if (lq->rear==lq->front) //若原队列中只有一个结点,删除后队列变空
  54. lq->rear=lq->front=NULL;
  55. else //原队有两个或以上结点的情况
  56. lq->front=lq->front->next;
  57. free(p);
  58. return ;
  59. }
  60. //----判断队空运算算法----
  61. int QueueEmpty(LQueue *lq)
  62. { if (lq->front==NULL) return ; //队空返回1
  63. else return ; //队不空返回0
  64. }
  65. //----输出队中所有元素的算法----
  66. int DispQueue(LQueue *lq)
  67. { QType *p;
  68. if (QueueEmpty(lq)) //队空返回0
  69. return ;
  70. else
  71. { p=lq->front;
  72. while (p!=NULL)
  73. { printf("%s ",p->data);
  74. p=p->next;
  75. }
  76. printf("\n");
  77. return ; //队不空返回1
  78. }
  79. }
  80.  
  81. void main()
  82. { int sel,flag=;
  83. LQueue *lq;
  84. char name[];
  85. InitQueue(lq); //初始化病人队列
  86. while (flag==) //未下班时循环执行
  87. { printf("1:排队 2:看医生 3:查看排队 0:下班 请选择:");
  88. scanf("%d",&sel); //选择一项操作
  89. switch(sel)
  90. {
  91. case : //医生下班
  92. if (!QueueEmpty(lq))
  93. printf(" >>请排队的患者明天就医\n");
  94. DestroyQueue(lq);
  95. flag=;
  96. break;
  97. case : //一个病人排队
  98. printf(" >>输入患者姓名:");
  99. scanf("%s",name);
  100. EnQueue(lq,name);
  101. break;
  102. case : //一个病人看医生
  103. if (!DeQueue(lq,name))
  104. printf(" >>没有排队的患者\n");
  105. else
  106. printf(" >>患者%s看医生\n",name);
  107. break;
  108. case : //查看目前病人排队情况
  109. printf(" >>排队患者:");
  110. if (!DispQueue(lq))
  111. printf(" >>没有排队的患者\n");
  112. break;
  113. }
  114. }
  115. }

算法学习day01 栈和队列的更多相关文章

  1. JavaScript中的算法之美——栈、队列、表

    序 最近花了比较多的时间来学习前端的知识,在这个期间也看到了很多的优秀的文章,其中Aaron可能在这个算法方面算是我的启蒙,在此衷心感谢Aaron的付出和奉献,同时自己也会坚定的走前人这种无私奉献的分 ...

  2. python数据结构与算法第六天【栈与队列】

    1.栈和队列的原理 栈:后进先出(LIFO),可以使用顺序表和链表实现 队列:先进先出(FIFO),可以使用顺序表和链表实现 2.栈的实现(使用顺序表实现) #!/usr/bin/env python ...

  3. C语言数据结构基础学习笔记——栈和队列

    之前我们学过了普通的线性表,接下来我们来了解一下两种特殊的线性表——栈和队列. 栈是只允许在一端进行插入或删除的线性表. 栈的顺序存储结构也叫作顺序栈,对于栈顶指针top,当栈为空栈时,top=-1: ...

  4. 【数据结构与算法】001—栈与队列(Python)

    栈与队列 1.栈(stacks)是一种只能通过访问其一端来实现数据存储与检索的线性数据结构,具有后进先出(last in first out,LIFO)的特征 2.队列(queue)是一种具有先进先出 ...

  5. 数据结构和算法(Java版)快速学习(栈与队列)

    栈是仅允许在表尾进行插入和删除操作的线性表.我们把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom).栈是一种后进先出(Last In First Out)的线性表,简称(LIFO ...

  6. DS博客作业03—栈和队列

    1.本周学习总结 本周学习了栈和队列两种数据结构,分别对应后进先出,先进先出两种数据操作 学会栈的特殊类型-共享栈,队列的特殊类型-循环队列的一系列操作 学会熟练使用栈和队列的STL容器,使代码简洁 ...

  7. 20162322 朱娅霖 作业005&006 栈,队列

    20162322 2017-2018-1 <程序设计与数据结构>第五.六周学习总结 教材学习内容总结 集合的介绍(总述) 集合是收集并组织其他对象的对象.主要分为线性集合(集合中的元素排成 ...

  8. 3-6-汉诺塔(Hanoi Tower)问题-栈和队列-第3章-《数据结构》课本源码-严蔚敏吴伟民版

    课本源码部分 第3章  栈和队列 - 汉诺塔(Hanoi Tower)问题 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接☛☛☛ <数据结构-C语言版> ...

  9. Java数据结构和算法 - 栈和队列

    Q: 栈.队列与数组的区别? A: 本篇主要涉及三种数据存储类型:栈.队列和优先级队列,它与数组主要有如下三个区别: A: (一)程序员工具 数组和其他的结构(栈.队列.链表.树等等)都适用于数据库应 ...

随机推荐

  1. 7. Go语言—时间模块

    一.时间模块 1. 统计程序执行时间 package main import ( "time" "fmt" ) func test() { time.Sleep ...

  2. Html学习之十二(CSS选择器的应用二)

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  3. 201271050130-滕江南-《面向对象程序设计(java)》第十三周学习总结

      201271050130-滕江南-<面向对象程序设计(java)>第十三周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daiz ...

  4. day56_9_20orm中的关键字段,orm查询13方法整合,查询优化和事务。

    一.常用字段. 在orm中有一些字段是常用字段: 1.AutoField 这个字段是自增的,必须填入参数primary_key=True,也就是说这个字段是表的主键,如果表类中没有自增列,就会自动创建 ...

  5. C++ 回调函数 Callback 机制例程

    #include <iostream> #include <thread> #include <mutex> #include <Windows.h> ...

  6. shellnet运行train_val_seg.py

    1.semantic3d数据集准备:prepare_semantic3d_data.py 11个测试数据集(.txt文件): 假如运行的是室外点云数据集“seg_semantic3d”,可能需要做以下 ...

  7. SQL Server 删除数据库

    1. 图形化界面删除 在所需要删除的数据库上右击,然后删除.注意如果这个数据库有应用或者用户连接,请勾选[关闭现有连接],否则无法删除. 2. DROP DATABASE删除数据库 drop data ...

  8. CF1207G Indie Album

    题目链接 problem 有\(n\)个字符串,对于第\(i\)个字符串通过以下两种方式中的一个给出. \(1\; c\),该字符串只含一个字符\(c\). \(2\ x\ c\),该字符串为第\(x ...

  9. 【2019.7.25 NOIP模拟赛 T3】树(tree)(dfs序列上开线段树)

    没有换根操作 考虑如果没有换根操作,我们该怎么做. 我们可以求出原树的\(dfs\)序列,然后开线段树维护. 对于修改操作,我们可以倍增求\(LCA\),然后在线段树上修改子树内的值. 对于询问操作, ...

  10. 第三方系统平台如何对接gooflow2.0

    第一步,参与者数据源配置 目前提供3种参与者数据源(员工,角色,部门),还有一种sql语句 XML配置如下 <?xml version="1.0" encoding=&quo ...