[数据结构]-拿捏队列、链表、栈核心问题

队列

数组实现队列(数组只用一次)

  • 初始化: frontrear 指针的初始值为 -1
  • 栈空: front == rear
  • 栈满: rear == maxSize - 1
  • 入栈: rear++; arr[rear] = value
  • 出栈: front++; value = arr[front]

数组实现环形队列(数组可以复用)

数组实现循环队列可以参考本篇文章 数组实现环形队列

  • 初始化: frontrear 指针的初始值为 0
  • 栈空: front == rear
  • 栈满: (rear+1) % maxSize == front
  • 入栈: arr[rear] = value; rear = (rear + 1) % maxSize
  • 出栈: value = arr[front]; front = (front + 1) % maxSize

链表

带头结点的单链表实现请戳这里 带头结点的单链表
带头结点的单链表进阶技术请戳这里 带头结点的单链表进阶
循环单链表的应用–解决约瑟夫环问题请戳这里 循环单向链表实现约瑟夫环问题

总结要点1

  • 带头结点链表遍历时,如果你希望获得的是当前的结点位置(如修改某个结点信息),则使用辅助指针初始化时为 Node tmp = head.next;,一般这种情况下遍历结束的条件为
while(true){
    //到达尾部的出口
    if(tmp == null){
   		break;
   }
   //目标条件
   else if(tmp.no == targetNo){
  		//找到了该位置
  		flag = true;
  		break;
  }
  // 其他的则需要向后移动指针
  tmp = tmp.next;
}

总结要点2

  • 如果希望查找的位置是目标节点的前一个位置(如单向单链表删除某个结点),则初始化辅助指针为 Node tmp = head ,一般遍历结束的条件为
while(true){
	//到达尾部了需要结束遍历
	if(tmp.next == null){
		break;
	}
	//找到目标结点的前一个位置了
	else if(tmp.next.no == targetNo){
    	flag = true;
    	break;
    }
    //否则需要往后移动指针
    tmp = tmp.next;
}

数组实现栈

  • 初始化:top 指针初始化为 -1
  • 栈空: top == -1
  • 栈满: top == maxSize - 1
  • 入栈: top++; arr[top] = value
  • 出栈: value = arr[top]; top--

栈的主要应用场景

  • 子程序的调用:在跳往子程序前,会先将下个指令的地址存到堆栈中,直到子程序执行完后再将地址取出,以回到原来的程序中;
  • 处理递归调用:和子程序的调用类似,只是除了存储下一个指令的地址外,也将参数、区域变量等数据存入堆栈中;
  • 表达式的转换【中缀表达式转后缀表达式】与求值;
  • 二叉树的遍历;
  • 图形的深度优先搜索法(DFS)等

中缀表达式转后缀表达式

1、定义两个栈,或者定义一个栈 s1 一个列表 s2 ,其中 s1 用来存储操作符,s2 用来存储得到的中间结果;
2、从左至右扫描中缀表达式:
3、遇到操作数时,将其放入列表 s2
4、若遇到运算符时,则比较运算符的优先级
(1)、如果 s1 为空,或者栈顶运算符为 (,则直接将此运算符入栈;
(2)、否则,若优先级比栈顶运算符优先级高,则直接将此运算符入栈;
(3)、否则,将 s1 栈顶的运算符弹出并放入到列表 s2 中,再次转至4-(1)与 s1 中新的运算符比较;
5、遇到括号时:
(1)、如果是 ( ,则直接压入栈 s1
(2)、如果是 ),则依次弹出 s1 中的运算符并放入 s2,直到遇到左括号为止,此时将这一对括号丢弃;
6、重复步骤 2-5 直到表达式的最右边;
7、将 s1 中剩余的运算符依次弹出并放入 s2
8、依次输出 s2 中的元素即为后缀表达式,【若 s2 使用栈结构,则输出 s2 的逆序为后缀表达式】。

后缀表达式的计算

1、定义一个栈 numStack 用来保存中间结果;
2、从左至右扫描后缀表达式:
3、如果当前元素为运算数,则直接压入栈 numStack 中;
4、如果当前元素为运算符,则弹出 numStack 栈顶两个元素完成运算,并将得到的中间结果压入栈 numStack 中;
5、重复以上过程,直到遍历完所有的后缀表达式元素,则栈内的最终元素即为计算结果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值