数据结构4-堆栈
2016-03-21 14:10
281 查看
堆栈:相同数据类型的组合,具有先进后出的特性(Last in,First out,LIFO)。
4.1简介
特性:
1)只能从顶端存取数据;
2)数据的存储符合后进先出原则。
基本运算:
堆栈的实现可以用数组结构或者动态链表来实现,也可以用队列来实现。
堆栈的链表实现:虽然以数组结构来实现对战的好处是算法简单,但是堆栈的大小是事先设计好的,需要最大限度申请内存。这样会造成内存空间的浪费!而使用链表来实现堆栈的优点是随时可以动态改变链表长度。
堆栈的应用:主要特点是限制数据的插入、删除位置,属于有序链表的应用,常用的应用场景有:
1)二叉树及森林的便利运算,如中序遍历、前序遍历;
2)CPU的中断处理;
3)图的深度优先便利法;
递归(Recuresion):如果一个程序能被自己所定义或者调用就称为递归程序。递归可以使得程序变得简单,但是设计时候必须非常小心,因为递归容易无法终止,导致内存的浪费。
下面以阶乘为例子:
方法1:使用for循环来计算
方法二:递归
递归程序必须具备以下条件:
1)一个可以反复执行的过程,也就是定义一个递归函数;
2)一个可以跳出反复执行过程的条件。
递归分类:
1)直接递归(Direct Recursion):在递归函数中允许直接调用该函数本身的递归为直接递归;
2)间接递归(Indirect Recursion):在递归函数中调用了其他递归函数,并且由其他递归函数调用回来的递归函数称为间接递归。
河内塔问题:
问题描述:将第一个木棒子的n个盘子移到第三根木棒,只能大的在下,小的在上。
4.3 算术表达式求值
方法有:中序法、前序法、后续法
具体为:中序法:2+3;//也就是我们常规的表达方式;
前序法:+23;
后续法:23+。
在利用栈运算时候,要建立两个堆栈,一个是存放运算符,一个是存放运算对象。
二叉树法就是把终须表达式按照优先级的顺序建成一棵二叉树,再按照树状结构的特性进行前、中、后序的遍历,即可得到前、中、后序表达式。
中序表达式转换成前序表达式规则:
中序表达式转换成后续表达式规则:
4.1简介
特性:
1)只能从顶端存取数据;
2)数据的存储符合后进先出原则。
基本运算:
create:建立一个空堆栈; push:存放顶端结构并传回新堆栈; pop:删除顶端结构并传回新堆栈; empty:判断堆栈是否为空堆栈,是返回true,否返回false; full:判断堆栈是否已满,是返回ture,否返回false。
堆栈的实现可以用数组结构或者动态链表来实现,也可以用队列来实现。
堆栈的链表实现:虽然以数组结构来实现对战的好处是算法简单,但是堆栈的大小是事先设计好的,需要最大限度申请内存。这样会造成内存空间的浪费!而使用链表来实现堆栈的优点是随时可以动态改变链表长度。
堆栈的应用:主要特点是限制数据的插入、删除位置,属于有序链表的应用,常用的应用场景有:
1)二叉树及森林的便利运算,如中序遍历、前序遍历;
2)CPU的中断处理;
3)图的深度优先便利法;
递归(Recuresion):如果一个程序能被自己所定义或者调用就称为递归程序。递归可以使得程序变得简单,但是设计时候必须非常小心,因为递归容易无法终止,导致内存的浪费。
下面以阶乘为例子:
方法1:使用for循环来计算
#include<iostream> using namespace std; int main() { int sum=1; for(int i=0;i<=4;i++) { cout<<"i是:"<<i<<endl; for (int j=i;j>0;j--)//for循环后面可以不加大括号,则只执行for后面的一句话。 {sum*=j; //cout<<"j是:"<<j<<endl; } cout<<i<<"!="<<sum<<endl; sum=1; } system("pause"); return 0; }
方法二:递归
递归程序必须具备以下条件:
1)一个可以反复执行的过程,也就是定义一个递归函数;
2)一个可以跳出反复执行过程的条件。
#include<iostream> #include<ctime> using namespace std; int recursive(int);//声明递归函数 int main() { for (int i=0;i<5;i++) cout<<i<<"阶乘为:"<<recursive(i)<<endl; system("pause"); return 0; } int recursive(int i) { clock_t start,finish; start=clock(); int sum; sum=1; if (i==0)//递归终止条件 return 1; else sum=i*recursive(i-1);//递归调用本身函数 finish=clock(); cout<<finish-start<<"/"<<CLOCKS_PER_SEC<<"(s)"<<endl; return sum; }
递归分类:
1)直接递归(Direct Recursion):在递归函数中允许直接调用该函数本身的递归为直接递归;
2)间接递归(Indirect Recursion):在递归函数中调用了其他递归函数,并且由其他递归函数调用回来的递归函数称为间接递归。
河内塔问题:
问题描述:将第一个木棒子的n个盘子移到第三根木棒,只能大的在下,小的在上。
#include<iostream> #include<ctime> using namespace std; void hanoi(int,int,int,int); int main() { int j;//盘子的个数 cout<<"请输入盘子的个数:"<<endl; cin>>j; hanoi(j,1,2,3); system("pause"); return 0; } void hanoi(int n,int p1,int p2,int p3) { if (n==1) cout<<"盘子从"<<p1<<"移动到"<<p3<<endl; else { hanoi(n-1,p1,p3,p2); cout<<"盘子从"<<p1<<"移动到"<<p3<<endl; hanoi(n-1,p2,p1,p3); } }
4.3 算术表达式求值
方法有:中序法、前序法、后续法
具体为:中序法:2+3;//也就是我们常规的表达方式;
前序法:+23;
后续法:23+。
在利用栈运算时候,要建立两个堆栈,一个是存放运算符,一个是存放运算对象。
二叉树法就是把终须表达式按照优先级的顺序建成一棵二叉树,再按照树状结构的特性进行前、中、后序的遍历,即可得到前、中、后序表达式。
中序表达式转换成前序表达式规则:
中序表达式转换成后续表达式规则:
相关文章推荐
- linux2.6内核的DAC数据结构(传统9Bit模式、ACL模式)
- 数据结构与算法javascript描述之队列
- Python 数据结构与算法——从某个列表中找出两个彼此最接近但不相等的数
- javascript算法与数据结构之栈
- Python 数据结构与算法——侏儒排序
- 数据结构7—线索二叉树 (java)
- 数据结构笔记-----二叉排序树和哈希表
- 数据结构3-链表
- Python 数据结构与算法——归并排序
- Python 数据结构与算法——递归
- Python 数据结构与算法——tree(树)
- Python 数据结构与算法——列表(链表,linked list)
- 数据结构课设 旅游规划(dijkstra扩展)
- 数据结构课设 公路村村通 (最小生成树prim算法)
- 算法浅谈——数据结构
- C语言 数据结构与算法 一
- 数据结构3.1--栈的线性表示
- Python中列表、字典、元组数据结构的简单学习笔记
- 用C#学习数据结构之线性表
- 数据结构 线性表的顺序储存结构