c语言栈的表达式求值,c语言栈实现表达式求值

dfnjsfkhak 8 0

大家好,今天小编关注到一个比较意思的话题,就是关于c语言栈的表达式求值的问题,于是小编就整理了3个相关介绍c语言栈的表达式求值的解答,让我们一起看看吧。

  1. 栈的特点是?
  2. 层叠架是什么?
  3. 为什么说java里面只有值传递?

栈的特点是?

栈(Stack)是一种数据结构,它具有以下特点:

1. 后进先出(LIFO):栈中最后一个元素被称为栈顶,而最先进入的元素被称为栈底。只能在栈顶进行插入删除操作,也就是说,最后一个插入的元素会先被删除。

c语言栈的表达式求值,c语言栈实现表达式求值-第1张图片-芜湖力博教育咨询公司
图片来源网络,侵删)

2. 仅限于栈顶操作:只能对栈顶元素进行插入、删除和访问操作,不能直接访问或修改栈中的其他元素。

3. 顺序性:栈中的元素是有序的,每个元素都有一个确定的前驱和后继。

4. 空间有限:栈具有固定的容量,一旦栈满时,再插入元素会导致栈溢出。

c语言栈的表达式求值,c语言栈实现表达式求值-第2张图片-芜湖力博教育咨询公司
(图片来源网络,侵删)

层叠架是什么

层叠架(stack),是数据结构中的一种,也是计算机程序中常用的一种数据结构。它是一种线性表,具有后进先出的特点,栈顶(top)和栈底(bottom)是两个端点。栈的主要操作包括入栈(push)和出栈(pop),入栈是向栈顶插入一个元素,出栈是从栈顶移除一个元素。栈常常用来实现内存中的函数调用、表达式求值和程序崩溃时输出错误信息等。还可以用栈来实现函数的非递归调用。它的运行方式具有可重复性、简单方便、安全可靠等优势。

为什么说java里面只有值传递

值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。我们来看下面一张图,看一下整个过程中发生了什么,为啥Java中只有值传递。

稍微解释下这张图,当我们在main创建一个User对象时候,在堆中开辟一块内存,其中保存了name和gender等数据。然后hollis持有该内存的地址0x123456(图1)。

c语言栈的表达式求值,c语言栈实现表达式求值-第3张图片-芜湖力博教育咨询公司
(图片来源网络,侵删)

当尝试调用pass方法,并且hollis作为实际参数传递给形式参数user的时候,会把这个地址0x123456交给user,这时,user也指向了这个地址(图2)。

然后在pass方法内对参数进行修改的时候,即user = new User();,会重新开辟一块0X456789的内存,赋值给user。后面对user的任何修改都不会改变内存0X123456的内容(图3)。

上面这种传递是什么传递?肯定不是引用传递,如果是引用传递的话,在执行user = new User();的时候,实际参数的引用也应该改为指向0X456789,但是实际上并没有。引用传递(pass by reference)是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。

所以,值传递和引用传递的区别并不是传递的内容。而是实参到底有没有被***一份给形参。在判断实参内容有没有受影响的时候,要看传的的是什么,如果你传递的是个地址,那么就看这个地址的变化会不会有影响,而不是看地址指向的对象的变化。就像钥匙和房子的关系。那么,既然这样,为啥上面同样是传递对象,传递的String对象和User对象的表现结果不一样呢?我们在pass方法中使用name = "hollischuang";试着去更改name的值,阴差阳错的直接改变了name的引用的地址。因为这段代码,会new一个String,再把引用交给name。而原来的那个”Hollis”字符串还是由实参持有着的,所以,并没有修改到实际参数的值。

所以说,J***a中其实还是值传递的,只不过对于对象参数,值的内容是对象的引用。


到此,以上就是小编对于c语言栈的表达式求值的问题就介绍到这了,希望介绍关于c语言栈的表达式求值的3点解答对大家有用

标签: 传递 参数 元素