理论:
共同特点:
栈:是限制在表的一端进行插入和删除运算的线性表。栈又称后进先出简称:LIFO表 队列:也是一种运算受限的线性表。它只允许在标的一端进行插入,而在另一端进行删除。队列亦称:先进先出FIFO表不同点:
队列是先进先出:就像一条路,有一个入口和一个出口,先进去的就可以先出去。
而栈就像一个箱子,后放的在上边,所以后进先出。
堆是在程序运行时,而不是在程序编译时,申请某个大小的内存空间。即动态分配内存,对其访问和对一般内存的访问没有区别。{堆是指程序运行是申请的动态内存,而栈只是指一种使用堆的方法(即先进后出)。}
栈是先进后出的,但是于堆而言却没有这个特性,两者都是存放临时数据的地方。 对于堆,我们可以随心所欲的进行增加变量和删除变量,不要遵循什么次序,只要你喜欢。
转载于http://blog.csdn.net/pkuyjxu/article/details/6325236
1.队列先进先出,栈先进后出。
2. 对插入和删除操作的"限定"。 栈是限定只能在表的一端进行插入和删除操作的线性表。 队列是限定只能在表的一端进行插入和在另一端进行删除操作的线性表。 从"数据结构"的角度看,它们都是线性结构,即数据元素之间的关系相同。但它们是完全不同的数据类型。除了它们各自的基本操作集不同外,主要区别是对插入和删除操作的"限定"。 栈和队列是在程序设计中被广泛使用的两种线性数据结构,它们的特点在于基本操作的特殊性,栈必须按"后进先出"的规则进行操作,而队列必须按"先进先出" 的规则进行操作。和线性表相比,它们的插入和删除操作受更多的约束和限定,故又称为限定性的线性表结构。
3.遍历数据速度不同。栈只能从头部取数据 也就最先放入的需要遍历整个栈最后才能取出来,而且在遍历数据的时候还得为数据开辟临时空间,保持数据在遍历前的一致性队列怎不同,他基于地址指针进行遍历,而且可以从头或尾部开始遍历,但不能同时遍历,无需开辟临时空间,因为在遍历的过程中不影像数据结构,速度要快的多
栈(Stack)是限定只能在表的一端进行插入和删除操作的线性表。
队列(Queue)是限定只能在表的一端进行插入和在另一端进行删除操作的线性表。
从"数据结构"的角度看,它们都是线性结构,即数据元素之间的关系相同。但它们是完全不同的数据类型。除了它们各自的基本操作集不同外,主要区别是对插入和删除操作的"限定"。
栈和队列是在程序设计中被广泛使用的两种线性数据结构,它们的特点在于基本操作的特殊性,栈必须按"后进先出"的规则进行操作,而队列必须按"先进先出"的规则进行操作。和线性表相比,它们的插入和删除操作受更多的约束和限定,故又称为限定性的线性表结构。可将线性表和栈及队列的插入和删除操作对比如下:
线性表
Insert(L,i,x)
(1≤i≤n+1)
Delete(L,i)
(1≤i≤n)
如线性表允许在表内任一位置进行插入和删除
栈
Insert(L,n+1,x)
Delete(L,n)
而栈只允许在表尾一端进行插入和删除
队列
Insert(L,n+1,x)
Delete(L,1)
队列只允许在表尾一端进行插入,在表头一端进行删除
转载于http://zhidao.baidu.com/link?url=DBe5vbclPyRZdTGrgcIW1saBeJ4Z5VR0JUJv7rspLaAXa7VzRHfkJ2gIrrBjwumO_76TrOHVQEpN85-Gwksqbq
应用:
建立一个空的堆栈。 while( 文件没有结束 ) { 读取一个字符。 if 遇到一个左括号,把它入栈。 else if 遇到右括号 then 检查堆栈,{ if 堆栈为空 then 报告错误,终止程序(括号不匹配)。 else if 堆栈非空 then { if 栈顶不是对应的左括号 then 报错,终止程序。 弹出栈顶。 } } if 栈非空 then 报错。
创建一个字符串output储存 postfix。 创建一个空栈 operators。 while ( ) 逐个读取 infix 中的元素,储存在 temp 中。 if temp 是数字(operand)then 把 temp 压入 output 字符串。 if temp 是除了右括号 ")" 之外的运算符(operator) if operators 栈空 then temp 入栈。 if operators 栈非空, while ( 栈顶元素优先级大于或等于 temp 并且 栈顶元素不等于左括号 ) 弹出栈顶元素到 output 。 if temp 是右括号 ")" while ( 栈顶元素不等于左括号 ) 弹出栈顶元素到 ouput. 弹出左括号, 但是不输出到 output
1. 输出 a,把 "*" 入栈 operators output top * a 2. "(" 入栈,输出 b operators output top ( * a b 3. "*"入栈,输出 c operators output top * a b c ( * 4. 读到 + 号,因为栈顶的 * 优先级大于 + 号,所以弹出栈顶到 output,也就是弹出 "*" ,并输出 "*" operators output top + a b c * d ( * 5.读到 ")" 右括号,弹出左括号 "(" 上的所有运算符,并弹出左括号 "(" ,注意此时左括号没有输出 operators output top * a b c * d + 6.最后所有元素依次出栈 operators output top a b c * d + *