1.顺序栈的要素
对于顺序栈st,一共有4个要素,包括两个特殊状态和两个操作。
(1)几个状态
1)栈空状态。
st.top==-1。有的书上规定st.top==0为栈空条件,这样会浪费一个元素大小的空间,本书统一规定栈空状态为st.top==-1。考试中有时会出现其他规定,其实大同小异,稍加注意即可。
2)栈满状态。
st.top==maxSize-1。maxSize为栈中最大元素的个数,则maxSize-1为栈满时栈顶元素在数组中的位置,因为数组下标从0号开始。本书规定栈顶指针top为-1时栈空,即top==0的数组位置也可以存有数据元素。
3)非法状态(上溢和下溢)。
栈满就是一种继续入栈就会上溢的状态,对应的栈下溢就是栈空的时候继续出栈所造成的结果。
(2)两个操作
1)元素x进栈操作:++(st.top);st.data[st.top]=x;。既然规定了top为-1时栈为空,则元素进栈操作必须是先移动指针,再进入元素,因为数组下标不存在-1。在其他书中因有不同规定,会有元素先进栈再栈顶指针加1的进栈操作,其实本质是一样的,考生注意即可。
2)元素x出栈操作:x=st.data[st.top];--(st.top);。进栈操作次序决定了出栈操作次序,由于进栈操作是先变动栈顶指针,再存入元素,因此出栈操作必须为先取出元素,再变动指针。如果在上述进栈操作不变的情况下先变动指针,再取出元素,则栈顶元素丢失,取出的是栈顶下边的元素。考生可动手自行模拟一下这个过程,以便于理解和加深记忆。
2.初始化栈的代码
初始化一个栈,只需将栈顶指针置为-1即可,其对应代码如下:
3.判断栈空代码(www.daowen.com)
栈st为空的时候返回1,否则返回0,其对应代码如下:
4.进栈代码
5.出栈代码
说明:在考试中,栈常常作为一个工具来解决其他问题,因此一般情况下,栈的定义以及操作可以写得很简单,不必调用以上函数。上述函数只作为标准操作来参考,使用价值并不高。在考题中比较实用的栈的操作的写法如下:
(1)定义一个栈并且初始化
假设元素是int型,可以这么写:
(2)元素x进栈
stack[++top]=x; //仅一句即实现进栈操作
(3)元素x出栈
x=stack[top--]; //仅一句即实现出栈操作
(2)与(3)需注意的地方是,当前栈是否为空,空时不出;是否为满,满时不进。这些判断根据题目需要来决定写还是不写,不必像标准操作那样每次都判断(如果题目中入栈元素不多,而maxSize足够大,就无须考虑入栈操作是否会产生溢出)。
通过(2)与(3)两点,来稍微复习一下C语言基础。top++与++top(--top与top--的情况类似)的不同可以用几句话来说清楚。前者是先将top赋值给接收它的变量,然后top自增1;而后者是先top自增之后,再把值赋给接收它的变量。例如,a=top++;,a保存了自增前的top值;而a=++top;,a保存了自增后的top值。同样,stack[++top]=x;,x存放到top变化之后所指示的位置上(一下看不懂可以拆开看。第一步:top先自增1;第二步:自增后的top把自己的数值放在stack[]的括号内而指出了将要保存元素的位置;第三步:x存储在top所指的位置上)。这里看懂了,就很容易理解stack[++top]=x;等价于top++;stack[top]=x;,而x=stack[top--];等价于x=stack[top];top--;。
这里还要再提一点,对于自增操作,如++a;总是比a++;执行的效率要高,因此在a++;与++a;等效的情况下,如独立的自增操作,总是用++a;。自减操作有相同的性质。
以上所讲的初始化栈,出栈与入栈的简单写法在考试的时候很实用,是提高程序书写速度的好方法,并且通过上面的理解很好记忆。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。