数据结构学习日志之五--栈

栈是限定仅在表尾进行插入或删除操作的线性表。所以对这样的线性表来说,表尾称为栈顶,表头称为栈底。

因为栈是仅在表尾进行修改,即栈的修改是按后进先出的原则进行的,所以栈又称后进先出的线性表。

栈的表示:

顺序栈,即是利用连续一组地址连续的存储单元一次存放自栈底到栈顶的元素,附设两个指针,top指向栈顶,base指向栈底,当top == base表示空栈,当top-base == stackSize表示栈已满,如图


栈的应用:

1.数制转换:基于十进制数N和其他d进制数的转换原理:N = (N div d)*d+ N mod d (div 为整除,mod为求余运算)

demo地址:https://github.com/chanbendong/DataStructure/blob/master/numConvert.c

递归

n阶Hanoi塔问题:当n=1时,只需要将编号为1的圆盘从塔座X直接移至塔座Z上。当n>2时,就需要借助Y作为辅助塔。如果能把编号为n的圆盘之上的n-1个圆盘从塔座X移至塔座Y上,则可以将编号为n的圆盘从塔座X移至Z,然后再将塔座Y的n-1个圆盘移至塔座Z上,这时候就考虑怎么把n-2个圆盘放到X塔座上,就可以将第n-1个圆盘放到塔座Z上,如此类推,便可求解

void hanoi(int n, char x, char y, char z)
{
    if(n == 1){
        move(x,1,z);
    }else{
        hanoi(n-1,x,z,y);//将x上编号为1至n-1的圆盘移到y,z作为辅助塔
        move(x,n,z);//将编号为n的圆盘从x移到z
        hanoi(n-1,y,x,z);//将y上编号为1至n-1的圆盘移到z,x作为辅助塔
    }
}

递归的问题实际是以栈的形式实现的。当有多个函数构成嵌套调用时,按照“后调用先返回”的原则,函数之间的信息转移和控制转移必须通过栈来实现。即系统将整个程序运行时的所需的数据空间安排在一个栈中,每当调用一个函数时,就为它在栈顶分配一个存储区,每当一个函数退出时,就释放它的存储区,则当前正运行的函数的数据区必然在栈顶

扫描二维码关注公众号,回复: 880624 查看本文章

猜你喜欢

转载自blog.csdn.net/chanbendong/article/details/79612086
今日推荐