2017.01.04:栈和队列

链表

1.链表是现行数据结构,C++中,List实现了双向链表,JAVA中LinkedList

2.哑节点:只要设计操作head节点,创建dummycode,ListNode*dummy = new ListNode(0);dummy-> = head;这使得操作head节点与操作其他节点无益。

3.对于寻找链表的某个特定位置的问题,不妨用两个指针变量runner与chaser(ListNode *runner = head, *chaser = head)以不同的速度遍历该链表,找到目标位置。

4.交换节点问题:先交换两个前驱节点的next指针,再交换这两个节点的next指针。

 

栈和队列(后进先出LIFO和先进先出FIFO)

1.用栈作为辅助,实现深度优先的算法:入栈操作相当与递归调用自身,出栈操作相当于递归返回。入栈操作的对象相当于需要被解决的问题,出栈对象相当于已经解决的问题。

2.解决汉诺塔问题。

 enum Tower {Zero, Left, Mid, Right};
 
 class HanoiObj{
	 public:
	 Tower src, tmp, dest;
	 HanoiObj(Tower s, Tower t, Tower d, int n):src(s),tmp(t),dest(d),num(n){
		 if (n == 1){
			 index = 1;
		 }
	 }
	 HanoiObj(Tower s, Tower t, Tower d, int i):src(s),dest(d),index(i){
		 num = 1;
		 tmp = Zero;
	 }
 };
 
 void move(Tower src, Tower dest, int index){
	 cout << "Move Disk #" << index << "from Tower" << src << "to Tower" << dest << endl;
 }
 
 void TOH (int N){
	 stack< HanoiObj *> Hstack;
	 Tower s, t, d;
	 int n;
	 Hstack.push(new HanoiObj(Left, Mid, Right, N));
	 while(!Hstack.empty()){
		 HanoiObj *tmpObj = Hstack.top();
		 Hstack.pop();
		 s = tmpObj -> src;
		 t = tmpObj -> tmp;
		 d = tmpObj -> dest;
		 n = tmpObj -> num;
		 if (n < 1){
			 continue;
		 }
		 if (n == 1){
			 move(s,d,tmpObj->index);
		 } else{
			 Hstack.push(new HanoiObj(t,s,d,n,-1));
			 Hstack.push(new HanoiObj(s,d,n));
			 Hstack.push(new HanoiObj(s,d,t,n,-1));
		 }
		 delete tmpObj;
	 }
 }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值