栈:是限制在表的一端进行插入和删除运算的线性表。栈又称后进先出简称:LIFO表
队列:也是一种运算受限的线性表。它只允许在标的一端进行插入,而在另一端进行删除。队列亦称:先进先出FIFO

不同点:

队列是先进先出:就像一条路,有一个入口和一个出口,先进去的就可以先出去。

而栈就像一个箱子,后放的在上边,所以后进先出。


进程中每个线程都有自己的堆栈,这是一段线程创建时保留下的地址区域。我们的“栈内存”即在此。至于“堆”内存,在未用new定义时,堆应该就是未“保留”未“提交”的自由空间,new的功能是在这些自由空间中保留(并提交)出一个地址范围。
栈(Stack)是操作系统在建立某个进程时或者线程(在支持多线程的操作系统中是线程)为这个线程建立的存储区域,该区域具有FIFO的特性,在编译的时候可以指定需要的Stack的大小。在编程中,例如C/C++中,所有的局部变量都是从栈中分配内存空间,实际上也不是什么分配,只是从栈顶向上用就行,在退出函数的时候,只是修改栈指针就可以把栈中的内容销毁,所以速度最快。 
堆(Heap)是应用程序在运行的时候请求操作系统分配给自己内存,一般是申请/给予的过程,C/C++分别用malloc/New请求分配Heap,用free/delete销毁内存。由于从操作系统管理的内存分配所以在分配和销毁时都要占用时间,所以用堆的效率低的多!但是堆的好处是可以做的很大,C/C++对分配的Heap是不初始化的。 

堆是在程序运行时,而不是在程序编译时,申请某个大小的内存空间。即动态分配内存,对其访问和对一般内存的访问没有区别。{堆是指程序运行是申请的动态内存,而栈只是指一种使用堆的方法(即先进后出)。}

栈是先进后出的,但是于堆而言却没有这个特性,两者都是存放临时数据的地方。 对于堆,我们可以随心所欲的进行增加变量和删除变量,不要遵循什么次序,只要你喜欢。

栈的应用

  1.数值转换:

  十进制转换成八进制:

public class Conversion {
    public static void conversion(int N){
        ArrayStack<Integer> stack = new ArrayStack<>();
        while( N != 0){
            stack.push(N % 8);
            N /= 8;
        }
        while(!stack.isEmpty()){
            System.out.print(stack.pop());
        }
    }

    public static void main(String[] args) {
        conversion(2007);
    }
}

  2.比较运算符的优先级:

 public static char precede(char θ1, char θ2) {
        if (θ1 == '+' || θ1 == '-') {
            if (θ2 == '+' || θ2 == '-' || θ2 == ')') {
                return '>';
            } else {
                return '<';
            }
        } else if (θ1 == '*' || θ1 == '/') {
            if (θ2 == '(') {
                return '<';
            } else {
                return '>';
            }
        } else if (θ1 == '(') {
            if (θ2 == ')') {
                return '=';
            } else {
                return '<';
            }
        }else if(θ1 == ')'){
            return '>';
        }
        return '>';
    }
}

 

 

posted on 2019-04-08 13:40  YOOC  阅读(129)  评论(0)    收藏  举报

导航