题目:假设以I和O分别表示入栈和出栈操作。栈的初态和终态均为空,入栈和出栈的操作序列可表示为仅由I和O组成的序列,可以操作的序列称为合法序列,否则称为非法序列,写一个算法,判定所给的操作序列是否合法。

输入:一个一维的字符型数组(由I和O组成),以‘0’为结束。

输出:判断出入栈的序列是否合法,输出结果。

优化目标:无。

算法思想:依次逐一扫描入栈出栈序列(即由“I”和”O“组成的字符串),每扫描至任意位置均需检查出栈次数(即"O"的个数)是否小于入栈次数(即”I“的个数),若大于则为非法序列。扫描结束后,再判断入栈和出栈次序是否相同,若不等为非法序列,反之为合法序列。

#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 20//判断出入栈操作序列是否合法
int Judge(char A[]){int i = 0;int j,k;j = k = 0;while(A[i]!='\0'){switch (A[i]) {case 'I':j++;break;case 'O':k++;if(k>j){printf("序列非法!");return -1;}}i++;}if(j!=k){printf("序列非法!");return -1;}else{printf("序列合法!");return 0;}
}//输入进出栈序列
void Input(char A[]){printf("请输入进出栈的顺序(以0为结束):");int i = 0;char ch;scanf("%c",&ch);while(ch!='0'&&i<20){A[i] = ch;i++;scanf("%c",&ch);}A[i] = '\0';
}int main(){char A[MAXSIZE];Input(A);Judge(A);}

题目:设单链表的表头指针为L,结点结构为data和next两个域构成,其中data域为字符型,试设计计算算法判断该链表的全部n个字符是否中心对称。例如xyx,xyyx都是中心对称。

输入:带头结点的链表个元素的值,类型为char,以‘0’结束。

输出:判断该单链表是否是中心对称,输出结果。

优化目标:无。

算法思想:用栈来判断链表中的数量是否中心对称。让链表的前一半元素依次进栈。在处理链表的后一半元素时,当访问到链表的一个元素后,就从栈中弹出一个元素。两个元素比较,若相等则将链表中的下一个元素与栈中再弹出的元素比较,直至链表到尾。这时若栈为空栈,则得出链表中心对称的结论;否则当链表中的一个元素与栈中弹出元素不等时,结论为链表非中心对称。

#include<stdio.h>
#include<stdlib.h>typedef struct LNode{char data;struct LNode *next;
}LNode,*LinkList;//判断单链表是否是中心对称
int dc(LinkList L,int n){int i;char s[n/2];LNode *p = L->next;for(i = 0;i<n/2;i++){s[i] = p->data;p = p->next;}i--;if(n%2 == 1){p = p->next;}while(p!=NULL&&s[i] == p->data){i--;p = p->next;}if(i == -1){return 1;}else{return 0;}}//创建链表
void creatList(LinkList &L,int &n){LNode *s,*r;n = 0;char x;printf("请输入链表元素值(以0结束):");L = (LinkList)malloc(sizeof(LNode));L->next = NULL;r = L;scanf("%c",&x);while(x!='0'){s = (LNode *)malloc(sizeof(LNode));s->data = x;r->next = s;s->next = NULL;r = s;n++;scanf("%c",&x);}
}//输出链表
void PrintList(LinkList L){LNode *p = L->next;printf("链表元素有:");while(p!=NULL){printf("%c   ",p->data);p = p->next;}printf("\n");
}int main() {LinkList L;int n;creatList(L,n);PrintList(L);printf("%d    \n",n);int k = dc(L,n);if(k == 1){printf("链表中心对称");}else{printf("链表不中心对称");}return 0;
}

题目:假设一个算术表达式中包括圆括号,方括号和花括号3种类型的括号,编写一个算法来判别表达式中的括号是否配对,以字符’\0‘作为算术表达式的结束符。

输入:一个一维的字符型数组(含括号算术表达式),以‘0’为结束。

输出:判断该算术表达式的括号使用是否合法,输出结果。

优化目标:无。

算法思想:扫描每一个字符。遇到花、中,园的左括号时进栈,遇到花、中、圆的右括号时检查栈顶元素是否是对应的左括号,若是,退栈,否则配对错误。最后栈若不为空也为错误(即左括号多了)。

#include<stdio.h>
#include<stdlib.h>#define Maxsize 20//顺序栈
typedef struct{char data[Maxsize];int top;
}SqStack;//初始化
void InitStack(SqStack &S){S.top = -1;
}//判空
int StackEmpty(SqStack S){if(S.top == -1){return 1;}else{return 0;}
}//进栈
int Push(SqStack &S, char e){if(S.top == Maxsize-1){printf("栈已满!");return 0;}S.data[++S.top] = e;return 1;}//出栈
int Pop(SqStack &S, char &e){if(S.top == -1){printf("栈已空!");return 0;}e = S.data[S.top--];return 1;
}//获取栈顶元素
int GetTop(SqStack S, char &e){if(S.top == -1){printf("栈已空!");return 0;}e = S.data[S.top];return 1;
}//判断括号匹配是否成功
void BracketsCheck(char A[]){SqStack S;InitStack(S);int i = 0;char e;while(A[i]!='\0'){switch (A[i]) {case '(':Push(S,'(');break;case '[':Push(S,'[');break;case '{':Push(S,'{');break;case ')':Pop(S,e);if(e!='('){printf("括号匹配失败!\n");return;}break;case ']':Pop(S,e);if(e!='['){printf("括号匹配失败!\n");return;}break;case '}':Pop(S,e);if(e!='{'){printf("括号匹配失败!\n");return;}break;default:break;}i++;}if(!StackEmpty(S)){printf("括号匹配失败!\n");}else{printf("括号匹配成功!\n");}}//输入算术表达式
void Input(char A[]){printf("请输入算术表达式的顺序(以0为结束):");int i = 0;char ch;scanf("%c",&ch);while(ch!='0'&&i<20){A[i] = ch;i++;scanf("%c",&ch);}A[i] = '\0';
}int main(){char A[Maxsize];Input(A);BracketsCheck(A);}

题目:假设火车调度站的入口处有n节硬座和软座车厢(分别用H和S表示)等待调度,试编写算法,输出对这n节车厢进行调度的操作(即入栈和出栈操作)序列,以使所有的软座车厢都调整到硬座车厢之前。

输入:一个一维的字符型数组(由H和S组成),以‘0’为结束。

输出:将软座和硬座的车厢序列调整好后,输出调整好的车厢序列。

优化目标:无。

算法思想:所有的硬座车厢全部入栈,车道中的车厢均为软座车厢。此时将栈道内的车厢调度出来,调整到软座车厢之后。

#include<stdio.h>
#include<stdlib.h>#define Maxsize 20//顺序栈
typedef struct{char data[Maxsize];int top;
}SqStack;//初始化
void InitStack(SqStack &S){S.top = -1;
}//判空
int StackEmpty(SqStack S){if(S.top == -1){return 1;}else{return 0;}
}//进栈
int Push(SqStack &S, char e){if(S.top == Maxsize-1){printf("栈已满!");return 0;}S.data[++S.top] = e;return 1;}//出栈
int Pop(SqStack &S, char &e){if(S.top == -1){printf("栈已空!");return 0;}e = S.data[S.top--];return 1;
}//将全部软座车厢调整到硬座车厢之前
void Train_Arrange(char A[]){SqStack S;InitStack(S);char *p = A,*q = A,e;while(*p){if(*p == 'H'){Push(S,*p);}else{*(q++) = *p;}p++;}while(!StackEmpty(S)){Pop(S,e);*(q++) = e;}
}//输入当前软座和硬座的顺序
void Input(char A[]){printf("请输入当前软座和硬座的顺序(以0为结束):");int i = 0;char ch;scanf("%c",&ch);while(ch!='0'&&i<20){A[i] = ch;i++;scanf("%c",&ch);}A[i] = '\0';
}//输出当前软座和硬座的序列
void Print(char A[]){int i = 0;printf("数组中数值为:");while(A[i]!='\0'){printf("%c  ",A[i]);i++;}printf("\n");
}int main(){char A[Maxsize];Input(A);Print(A);Train_Arrange(A);Print(A);}

今日总结:今天做了几道栈的题,感觉栈的应用还是很广泛的,例如,洗干净的盘子总是逐个往上叠放在已经洗好的盘子上面,而用时从上往下逐个取用。在程序设计中,如果需要按照保存数据时相反的顺序来使用数据,则可以利用栈来实现。

C语言练习-day25相关推荐

  1. 视频教程-《信息学竞赛-C/C++入门》 C++语言-C/C++

    <信息学竞赛-C/C++入门> C++语言 毕业于清华大学,曾担任Google算法工程师,微软人工智能领域全球最具价值专家,微软Tech Ed 大会金牌讲师. 精通C/ C++,Pytho ...

  2. JAVA萌新学习day25 css

    JAVA萌新学习day25 css 一.CSS概念: CSS :层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML(标准通用标记语言的一个应 用)或XML(标准 ...

  3. Go语言的错误异常处理机制及其应用

    一.背景 在日常编写golang程序或阅读别人的golang代码时,我们总会看到如下的一堆代码块: xx, err = func(xx) if err != nil {//do sth. to tac ...

  4. Go 知识点(19)— Go 语言中的野指针

    野指针是一种指向内存位置是不可知的指针,一般是由于指针变量在声明时没有初始化所导致的.在 Go语言中,布尔类型的零值为 false,数值类型的零值为 0,字符串类型的零值为 "", ...

  5. gcc 自动识别的文件扩展名,gcc/g++ -x 选项指定语言,不同 gcc 版本 -std 编译选项支持列表

    对于执行 C 或者 C++ 程序,需要借助 gcc(g++)指令来调用 GCC 编译器. 对于以 .c 为扩展名的文件,GCC 会自动将其视为 C 源代码文件 对于以 .cpp 为扩展名的文件,GCC ...

  6. OpenCV 笔记(07)— Mat 对象输出格式设置(Python 格式、CSV 格式、NumPy 格式、C 语言格式)

    首先是下面代码中将要使用的 r 矩阵的定义.需要注意,我们可以通过用 randu 函数产生的随机值来填充矩阵, 需要给定一个上限和下限来确保随机值在期望的范围内. Mat r = Mat(2, 3, ...

  7. 利用牛顿法求平方根-Go语言实现

    牛顿法解释 百度的解释如下: 通俗的解释就是:多数方程不存在求根公式,牛顿提出了一种用迭代来求方程近似根的方法.思路就是不断取切线,用线性方程的根逼近非线性方程f(x)=0f(x)=0f(x)=0的根 ...

  8. 翻转二叉树 c语言实现 递归 栈 队列

    前言 题目比较好理解,就是翻转二叉树 代码 c语言实现 #include<stdio.h> #include<stdlib.h> #include<string.h> ...

  9. 字符串全排列的问题 python和c语言实现

    前言 这是一个的经典的问题 设计一个算法,输出一个字符串字符的全排列. 比如,String = "abc" 输出是"abc","bac",& ...

  10. 快速排序的递归和非递归实现 c语言版本

    代码 挖坑法 解释 选取一个关键字(key)作为枢轴,一般取整组记录的第一个数/最后一个,这里采用选取序列第一个数为枢轴,也是初始的坑位. 设置两个变量i = l;j = r;其中l = 0, r = ...

最新文章

  1. mysql5.7在centos上安装
  2. 鸿蒙51单片机,基于C51系列单片机的交通控制系统设计
  3. 【转】真正从零开始,TensorFlow详细安装入门图文教程!(帮你完成那个最难的从0到1)...
  4. umask 和 新建文件、目录的默认权限
  5. 13_Android的生命周期
  6. flutter图片识别_从头到尾撸一遍Flutter的一切...
  7. slf4j注解log报错_这个注解一次搞定限流与熔断降级:@SentinelResource
  8. vivo解bl锁_黔隆科技刷机教程酷派Y82820忘记密码刷机解锁降级救砖解屏幕锁账户锁教程...
  9. Unity使用FGUI的基本操作(一)
  10. 无线网络技术导论笔记(第五讲)
  11. 计算机主机内部接口示意图,电脑主机后面六个孔图解 电脑的各个接口详解
  12. shell while循环退出
  13. 9.23 深度学习微调
  14. xxl-job集群原理
  15. (个人记录)Ensight后处理EDEM学习笔记
  16. MySQL(二)查询操作
  17. 大神教玩转手机摄影+后期
  18. rotate_end_effector in circular
  19. ?让孩子长高的妙法!99%的妈妈不知道
  20. pythonnet的使用

热门文章

  1. 关于Android Handler同步屏障那些事
  2. python 图表制作及功能化_Python实现从excel读取数据绘制成精美图像
  3. linux驱动开发总体结构,设备结构体分析
  4. (第三天)磁盘分区----LVE逻辑卷
  5. python爬取行业数据_Python爬取拉钩招聘网,让你清楚了解Python行业
  6. 中易浏览器(enjoyie) 录音软件
  7. 逆转三国攻略-各阶段关卡武将
  8. 基于Linux通用GPIO接口的操作函数
  9. Android Tv限制后台进程数量
  10. html标签(5):form,input,select,textarea