4.13实验 加测试题目

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

没啥就是链栈和顺序栈

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

来和我一起写写吧

//顺序栈
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树,并输出它的后序遍历序列。

4.13实验 加测试题目_第1张图片

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了

撒花谢幕!!!!!!

 

 

你可能感兴趣的:(c++,算法,c语言)