栈stack(1):栈的数组实现

定义


 

  栈(stack),是一个只允许在表尾端进行删除插入操作的线性表,是一种后进先出(LIFO,last in first out)的数据结构。

  因此,对于栈来说,我们规定进行删除插入操作的表尾端称为栈顶(top),相应地表头端称为栈头(bottom)。不含元素的空表叫做空栈。

  举个例子,有一个桶,我们向其依次放入序号为2 1 3的小球,如果你想拿出2的话就必须拿出3。这个时候我们称3为栈顶元素,1为栈底元素,没有小球的桶被我们称为空栈。

     

  再者,当浏览网页时需要退回到之前的某个网页,我们需要一步步点击后退键,而不能直接回去。并且我们只能对当前网页进行操作

  

 

实例


 

 

  运用栈解决回文字符串的判断。

  我们规定,当一个字符串正读反读均相同的话,我们称之为回文字符串。

  这里栈的实现只需要一个一维数组和一个指向栈顶的变量top即可,我们通过top来对栈进行插入与删除操作。

算法难点:

  1.初始化栈,top=0即初始化为空栈。

  2.入栈操作是top++,s[top]=x;

  3.由于回文字符串的特殊性,不需要全入栈,定义一个标志变量mid作数据中点,规定数列为n-1,(含\0,总长为n),若是奇数列,则mid标志为n/2-1,若为偶数列,则mid标志为n/2

  4.定义一个next作为匹配变量,a[i]与s[top]进行比较

  5.由于进栈是top+1,出栈是top-1,所以进栈后top=mid+1,应归位为mid,出栈后为top=top-1,最后top值为-1,所以用if(s[top]==-1)判断出栈是否完毕

 

代码


 

  

/*************************************************************************
    > File Name:判断回文数(栈实现)
    > Author: Bw98
    > Mail: 786016746@qq.com
    > Blog: www.cnblogs.com/Bw98blogs/
    > Created Time: MON 17th Jul. 2017
 ************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>  //调用strlen();原型
int main()
{
        char a[20],s[20];
        int i,top,len,mid,next;
        printf("input string:");
        gets(a);
        len=strlen(a);
        mid=len/2-1;
        //栈初始化
        top=0;
        //数据输入栈
        for(i=0;i<=mid;i++)
        {
                s[top++]=a[i];
        }
        //栈顶top归位
        top=mid;
        //匹配下标
        if(len%2!=0)
                next=mid+2;
        else
                next=mid+1;
        //判断回文数
        for(i=next;i<len;i++)
        {
                if(a[i]!=s[top--])
                        break;
        }
        //出栈判断
        if(top==-1)
                printf("stack all out!\n");
        else
                printf("not all out yet.\n");
    return 0;
}

 

转载于:https://www.cnblogs.com/Bw98blogs/p/7192807.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值