《王道》课后练习1:栈

news/2024/11/15 5:37:32/
03:

栈的初态和终态均为空,以I和O分别表示入栈和出栈,则出入栈的操作序列可表示为由I和O组成的序列,可以操作的序列称为合法序列,否则称为非法序列。

1)下面所示的序列中哪些是合法的?

分析:1.入栈次数>=出栈次数 (当前操作)     2.结束时要求栈是empty()

A.IOIIOIOO   合法

B.IOOIOIIO   不合法,因为先入栈1次然后出栈2次

C.IIIOIOIO     不合法,因为本题要求栈的终态为空

D.IIIOOIOO    合法

2)通过对1)的分析,写出一个算法,判定所给的操作序列是否合法,返回true/false

算法设计前思考:

1.input是一个一维数组,如1)中所示,output是true/false

2.遍历数组

3.不合法的条件:

               if(当前入栈次数<出栈次数)   

               if(遍历完成后,栈not empty())

      所以需要设置变量来记录I和O的数量,并且每遍历到下一个字母,都要进行一次if判断

bool Legal_OOL(vector<char> A){int num_I=0;//入栈次数int num_O=0;//出栈次数int i=0;//工作指针i,用来扫描字符串数组while(A[i]!='\0'){if(A[i]=='I'){  num_I++; }if(A[i]=='O'){  num_O++; }//判定if(num_O>num_I){ return flase; }i++;}//如果出入栈次数不相等,即最后栈非空if(num_O!=num_I){   return false; }return true;
}
04:

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

算法设计前思考:

1.input是一个单链表,output是true/false,那么函数可以写作:

bool IsCenter(LinkList L){}

2.基本要做的事情就是遍历这个单链表L,从头到尾。那么如何判断中心对称呢?

   如果正着数和倒着数是一模一样的,就返回true,因为单链表不像数组判定回文数那么方便从尾巴    “倒着”遍历

   如果从第一个节点向后,一个一个把node放入栈,再从栈里拿出来,就得到逆序的了。

3.于是我copy一个LinkList L2,用工作指针p遍历L2同时再取stack.top,用if判定(stack.top==p)

    然后stack.pop,while(stack not empty){}完成之后如果全都相等就返回true.

//栈用顺序数组实现
bool IsCenter(LinkList L,int n){LinkList L2=Copy(LinkList L);char st[n];//遍历L元素入栈st[i]LinkNode* p=L->next;int i=0;while(p!=nullptr){st[i]=p->data;p=p->next;i++;}LinkNode* p2=L2->next;while(p2!=nullptr){if(p2->data!==s[i]){return false;}else{p2=p2->next;i--;}}return true;
}LinkList Copy(LinkList L){//尾插法LinkList L2=L;LinkNode* rear=L2;while(p!=nullptr){LinkNode* p=L->next;LinkNode* node=new LinkNode;node->data=p->data;rear->next=node;rear=node;}
retuen L2;
}
05:

     设有2个栈,都采用顺序栈的方式,并且共享一个储存区[0,...,MaxSize-1],为了尽量利用空间,减少溢出的可能,可采用栈顶相向、迎面增长的形式。试设计s1,s2有关入栈和出栈的操作算法。

#define MaxSize 100
typedef struct{int Share_stack[MaxSize];int top1;int top2;
}share_st;

1.入栈时st1有top1++,st2有top2--;

int push(int i,int x){
//先判断栈满
if(share_st.top2-share_st.top1==1){cout<<"栈已满,不可入栈";exit(0);
}if(i==1){//入左边栈share_st.top1++;share_st.Share_stack[share_st.top1]=x;return 1;
}
if(i==2){//入右边栈share_st.top2--;share_st.Share_stack[share_st.top2]=x;return 1;
}}

出栈时,top1--,top2++

int pop(int i){
//首先判空
if((share_st.top1==-1)||(share_st.top2==MaxSize))
{cout<<"栈为空,没有元素可以出栈";exit(0);
}if(i==1){//出左边栈顶元素return share_st.Share_stack[share_st.top1];top1--;
}
if(i==2){//出右边栈顶元素return share_st.Share_stack[share_st.top2];top2++;
}}


http://www.ppmy.cn/news/1508724.html

相关文章

redis 入门,一起学习redis

文章目录 一、什么是redis? redis的作用&#xff1f;二、redis的特点三、redis的基本数据结构类型四、redis 的三种特殊数据类型五、redis 作为缓存六、redis 作为缓存存在的问题6.1 数据一致性6.2 缓存雪崩6.3 缓存穿透6.4 缓存击穿 七、redis为什么那么快&#xff1f;八、re…

C语言——预处理详解(下)

目录 前言 #和## 1.#运算符 2.##运算符 命名约定 #undef 命令行定义 条件编译 1.单分支条件编译 2.多分支条件编译 3.判断是否被定义 4.嵌套指令 头文件的包含 1.头文件被包含的方式 (1)本地文件包含 (2)库文件包含 2.嵌套文件包含 其他预处理指令 1.#error…

第三章 zookeeper+kafka群集

消息队列 概念 消息&#xff08;Message&#xff09;是指在应用间传送的数据消息队列&#xff08;Message Queue&#xff09;是一种应用间的通信方式解决方法&#xff0c;确保消息的可靠传递 特征 存储 将消息存储在某种类型的缓冲区中&#xff0c;直到目标进程读取这些消…

【HarmonyOS NEXT星河版开发学习】小型测试案例11-购物车数字框

个人主页→VON 收录专栏→鸿蒙开发小型案例总结​​​​​ 基础语法部分会发布于github 和 gitee上面&#xff08;暂未发布&#xff09; 前言 经过一周的学习&#xff0c;我发现还是进行拆分讲解效果会比较好&#xff0c;因为鸿蒙和前端十分的相识。主要就是表达的方式不同罢了…

设计模式-单例设计模式

单例模式的设计和线程安全 单例模式是一种创建型设计模式&#xff0c;确保一个类只有一个实例&#xff0c;并提供一个全局访问点。实现单例模式时&#xff0c;线程安全性是一个重要考虑因素&#xff0c;特别是在多线程环境中。 1. C11 之前的线程安全实现 在 C11 之前&#…

电商平台的推荐算法需要备案吗?

答案是肯定的&#xff01; 政策要求&#xff1a; 根据我国《互联网信息服务算法推荐管理规定》&#xff08;以下简称《规定》&#xff09;第六条&#xff0c;具有舆论属性或社会动员能力的互联网信息服务&#xff0c;包括电商平台的推荐算法&#xff0c;需要进行备案。 电商平…

Openlayers6 图形绘制和修改功能(结合React)

Openlayers常用的API了解的差不多了&#xff0c;就开始进入实战了&#xff0c;首先从绘制基本的图形开始&#xff0c;这里主要介绍一下绘制圆形、矩形和多边形。 通过使用openlayers的ol.interaction.Draw和ol.interaction.Modify模块实现地图上绘制圆形、矩形、多边形并修改编…

C++ 函数语义学——inline 函数回顾和扩展

inline 函数回顾和扩展 inline 函数回顾和扩展 inline 函数回顾和扩展1. inline 函数回顾2. inline 扩展总结 1. inline 函数回顾 inline 函数即有优点又有缺点&#xff0c;优点是它的执行成本一般比常规的函数调用和函数返回所带来的成本低&#xff0c;提高了程序执行效率&am…