4.13实验 加测试题目
发布日期:2023-06-07 22:27:41 浏览次数:31 分类:技术文章

本文共 2664 字,大约阅读时间需要 8 分钟。

今天是个好日子,要搞栈的实验

没啥就是链栈和顺序栈

和出栈入栈,强大都是从最基本开始的

来和我一起写写吧

//顺序栈typedef struct node{    int *base;    int *top;    int sizer;}shed;//链栈typedef struct Node{int data;struct Node* next;}*stact,link;//顺序栈的初始化

基本的模板 

接下来就是push和pop

//顺序栈的入栈void push(shed &s,int e){    if((s.top-s.base)!=s.sizer)    *(s.top++)=e;    else        printf("栈满,操作无效");}//链栈的入栈void pushs(stact &t,int i){stact k=(stact)malloc(sizeof(stact)); k->next=t->next; k->data=i; t->next=k;}

一点不长但是就是脑袋要清晰一点 ,错了就要每个看一遍难受的要命

pop

//顺序栈的出栈void pop(shed &s,int &a){    if(s.base==s.top)        printf("栈空操作无效");    else        a=*(--s.top);}//链表的出栈void pops(stact t,int &e){    if(t->next!=NULL){    stact p=t->next;    t->next=p->next;//头节点后第一个出去的    e=p->data;    free(p);    }}

细心永远不亏!!

接下来就是遍历输出

//链栈的展示void shows(stact t){stact p=t->next;while(p!=NULL){    printf("%d ",p->data);    p=p->next;}printf("\n");}//顺序栈的输出展示void show(shed &s){    int* j=s.base;    for(;j

没有写返回栈元素数目(实验的没要求) 

其他的要求都可以用这上面的函数拼成

写完有时间看看我测试没写完的题目了

FBI树

Description

我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全“1”串称为I串,既含“0”又含“1”的串则称为F串。

FBI树是一种二叉树,它的结点类型也包括F结点,B结点和I结点三种。由一个长度为2^N的“01”串S可以构造出一棵FBI树T,递归的构造方法如下:

1)T的根结点为R,其类型与串S的类型相同;

2)若串S的长度大于1,将串S从中间分开,分为等长的左右子串S1和S2;由左子串S1构造R的左子树T1,由右子串S2构造R的右子树T2。

现在给定一个长度为2^n的“01”串,请用上述构造方法构造出一棵FBI树,并输出它的后序遍历序列。

Input

第一行是一个整数N(0  < =  N  < =  10),第二行是一个长度为2^N的“01”串。

数据规模和约定,对于全部的数据,N  < =  10。

注:

[1]  二叉树:二叉树是结点的有限集合,这个集合或为空集,或由一个根结点和两棵不相交的二叉树组成。这两棵不相交的二叉树分别称为这个根结点的左子树和右子树。
[2]  后序遍历:后序遍历是深度优先遍历二叉树的一种方法,它的递归定义是:先后序遍历左子树,再后序遍历右子树,最后访问根。

Output

包括一行,这一行只包含一个字符串,即FBI树的后序遍历序列。

Sample Input 1 

3 10001011

Sample Output 1

IBFBBBFIBFIIIFF

没错是线段树,很简单的线段树

本来想用之前的线段树的模板改成答案,发现连lazy数组都不要,简直太友好了,那就直接重大一遍

 关键就是对树的维护就不是加减乘除了,而是用字符判断了

#include
#include
char tree[5050];//开这末大是怕最后遍历的时候会下标越界char a[1050];void nerw(){for(int j=1;j<=5050;j++){ tree[j]='0';}}void he(int p){//维护数组 if(tree[2*p]=='F'||tree[2*p+1]=='F'){ tree[p]='F'; } else if(tree[2*p]=='I'&&tree[2*p+1]=='B'){ tree[p]='F'; } else if(tree[2*p]=='B'&&tree[2*p+1]=='I'){ tree[p]='F'; } else if(tree[2*p]=='B'&&tree[2*p+1]=='B'){ tree[p]='B'; } else if(tree[2*p]=='I'&&tree[2*p+1]=='I'){ tree[p]='I'; }}void builtree(int p,int x,int y){if(x==y){ if(a[x-1]=='0'){ tree[p]='B'; } else{ tree[p]='I'; }}else{ int mid=(x+y)/2; builtree(2*p, x, mid); builtree(2*p+1, mid+1,y);}he(p);}void bianli(int p){ if(tree[p]!='0'){ bianli(2*p); bianli(2*p+1); printf("%c",tree[p]); } else{ return ; }}int main(){int n;nerw();scanf("%d",&n);scanf("%s",a);int l=strlen(a);builtree(1,1,l);bianli(1);return 0;}

通俗易懂,学过线段树的人一看就会

几天没写线段树,现在又相当于复习了哈哈

今天ok了

撒花谢幕!!!!!!

 

 

转载地址:https://blog.csdn.net/jdjdhdha/article/details/130120039 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:qml,创建Calendar,并且设置小一点
下一篇:qml,设置Calendar左右按钮小一点 使用 QtQuick.Controls 2.5版本

发表评论

最新留言

不错!
[***.144.177.141]2024年04月20日 13时22分16秒