前言
声明:因个人能力有限,本文仅是个人的学习记录笔记,有错误之处还望指出数据结构每日一题
题目
给定一个头指针L为带头结点的非循环双向链表,并且节点内多了一个freq域(记录访问次数),按要求实现一个Locate(L,X)算法,实现定位查找X值,并且在找到X的时候freq+1,同时将链表中的结点保持访问次数递增排列
要点
- 双链表的遍历
- 双链表的结点插入
- 双链表的结点提取
思想
- 遍历整个双链表,找到元素值为X的结点,并且freq+1
- 将该节点取下,遍历整个双链表寻找到小于该节点的freq的结点,将该节点插入
DLinklist Locate(DLinklist L,ElemType X){
DNode *p=L->next,*q;
//p非空,且值不为X的结点后移
while(p!=NULL && p->data !=X){
p=p->next;
if(p ==NULL) //遍历完也没有找到P
printf("不存在值为X的结点");
else{
p->freq ++;
//取下P结点
if(p->next != NULL){
p=p->next->prior=p->prior;
p->prior->next=p->next;
}
//寻找到freq值小于取下的结点的freq,将p插入(q从后往前找)
while(q != L && q->freq <= p->freq ){
q=q->prior;
p->next=q->next;
q->next->prior=p;
p->next=q;
q->next=p;
}
}
}
return p; //返回值为X的结点
}
中缀转后缀的方法
- 遇到操作数(a,b,c)的时候:直接输出,添加到后缀表达式中
- 栈为空的时候,遇到运算符直接输出
- 遇到左括号:将其入栈
- 遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出的元素是左括号(左括号不输出直接删除)
- 遇到其他运算符:加减乘除,弹出所有优先级大于或等于该运算符的栈顶元素,然后将该运算符入栈
比较入栈元素和栈顶元素,只有优先级小于栈顶元素才入栈,其余都出栈 - 最终将栈的元素依次出栈输出