欢迎使用本站,预祝练习时长两年半的选手们到成功! [本模块信息来自tem/def/head]

class09-10 树形结构 lhy

时间:2024-08-09 12:00 作者:admin 点击:
栈:四种类型题 1、进制转换问题 2、括号匹配问题: 左入右出:1353,1354,1355 () 基本操作 []() 升级版:判断类型 ([{ plus版:判断类型判断优先级 3、车厢调度 4、后缀表达式计算 #include sta

栈:四种类型题

1、进制转换问题

2、括号匹配问题:

  左入右出:1353,1354,1355

  () 基本操作

  []() 升级版:判断类型

  <([{ plus版:判断类型判断优先级

3、车厢调度

4、后缀表达式计算


#include <stack> //stack<int> s;

int n;

cin>>n;

int b[1000]={};


for(int i=0;i<n;i++) cin>>b[i];

stack<int> c;//创建栈

int a=1;

for(int i=0;i<n;i++){

  if(c.empty()) c.push(a++);//先存a,然后a自增1

  while(c.top()!=b[i]&&a<=n) c.push(a++);

  if(c.top()==b[i]) c.pop();

  else cout<<"NO";

}

if(c.empty()) cout<<"YES";

else cout<<"NO";


c.empty();//判断栈空 空true 不空false

c.push(x);//入栈

c.pop();//出栈

c.top();//获取栈顶元素

c.size();//栈内元素的数量


后缀表达式(逆波兰式)

运算符所在的位置不同


中缀表达式:人类的数学表达式

后:将中缀表达式的括号去掉,运算符后置

   1+2*(3-4)/5+6

1、先将运算符的优先级用括号表达出来

1+2*(3-4)/5+6 -> ((1+((2*(3-4))/5))+6)

2、从里到外拆括号,拆的过程,移动运算符位置

((1+((2*(3-4))/5))+6)

((1+((2*34-)/5))+6)

((1+(234-*/5))+6)

((1+234-*5/)+6)

(1234-*5/++6)

1234-*5/+6+


   1+2*(3-4)/5+6

    4 2  1  3 5

   

    1 2 3 4-* 5/+ 6+

1、先把数字抄下来

2、把运算符的先后顺序标出来

3、按照标号顺序,往后写


输入中缀,输出后缀

创建一个符号栈

遇到数字就输出

遇到符号就入栈(前提是栈顶优先级低,否则先出栈后入栈)

遇到左括号,代表一个新的开始,遇到右括号代表当前的结束

string str;//中缀

cin>>str;

stack<char> s;

for(int i=0;i<str.size();i++){

  if(str[i]>=48&&str[i]<=57) cout<<str[i];

  else if(str[i]=='(') s.push(str[i]);

  else if(str[i]==')'){

     while(s.top()!='(') {

        cout<<s.top();

        s.pop();

     }

     s.pop();//去掉多余的左括号

  }

  else {

     while(!s.empty()&&s.top()!='('&&s.top()优先级>=str[i]优先级){

        cout<<s.top();

        s.pop();

     }

     s.push(str[i]);

  }

}

字符串下标代表优先级

string yxj="+-*/";//yxj.find(s.top())/2

函数

int getyxj(char c){

  if(c=='+'||c=='-') return 1;

  if(c=='*'||c=='/') return 1;

}


输入后缀,输出结果

创建一个数字栈

遇到数字进栈(数字如果多余1位,需要拼接)

遇到符号,出栈两个,计算,将结果放回


string s="1353 547 645 35 3254 ";

string t="";

for(int i=0;i<s.size();i++){

  if(s[i]>=48&&s[i]<=57){

     t+=s[i];

  }

  else if(s[i]==' '){

     int a=stoi(t);

     t="";

  }

}


int a=s.top();s.pop();

int b=s.top();s.pop();

s.push(b+a);


输入中缀,输出结果


stack栈

empty(); push(); pop(); size(); top();

stack<int> s;

s.push(x);

s.pop();

cout<<s.top();

c++中的容器适配器之一,其他两个分别是

queue队列

queue<int> q;

q.push(x);

q.pop();

cout<<q.front();

cout<<q.back();

empty(); push(); pop(); size(); front(); back();


priority_queue()优先队列(底层是堆)

empty(); push(); pop(); size(); top();//堆顶总是最大值


-----------

c++:序列容器,关联容器,容器适配器

-----------

链表 :一对一结构,除了链头和链尾,其他的节点都有唯一的前驱和后继

树:一对多结构,除了根和叶子,其他的节点都有唯一的前驱和不唯一的后继

struct node{

  char c;

  node* fat;

  vector<node*> chi;

};

一维数组存树

邻接表存树

邻接矩阵存树(其实用来存图)


概念:

节点:树上的每个元素

根节点/祖先节点:最高层的节点,没有父节点的节点

叶子节点:没有子节点的节点

父节点,子节点

兄弟节点:同一父节点的节点

子孙节点:子节点以及子节点的子节点等合集

路径:树上的两个节点相连的一系列边

深度:节点到根节点的路径长

子树:某个节点及其所有的子孙节点的集合

度:一个节点的子节点数量

树的度:树上所有节点中,最大的度就是树的度


二叉树:每个节点最多有两个子节点的树

满二叉树:每一层的节点都是满的

完全二叉树:除了最后一层,每一层都是满的,最后一层节点都靠左,没有空隙

堆:每个节点都比它的子节点大(小)的完全二叉树(最小堆,最大堆,小顶堆,大顶堆)


完全二叉树,把节点编号,从上到下,从左到右

如果根序号为1,对于任意节点x,其父节点序号为x/2,左右子节点序号为2*x,2*x+1

如果根序号为0,对于任意节点x,其父节点序号为(x-1)/2,左右子节点序号为2*x+1,2*x+2


下节课代码:

对于树的遍历:

先序遍历、中序遍历、后序遍历、层序遍历

哈夫曼树(哈夫曼编码)、二叉搜索树、二叉堆&堆排序


题目:

栈题,队列题,树:1336

算法:递推递归

(责任编辑:admin)
    顶一下
    (0)
    0%
    踩一下
    (0)
    0%