数据结构入门学习系列-8(栈的经典算法用例)

本文介绍了栈在计算机科学中的三种经典应用:进制转换、括号匹配问题以及递归算法的实现。通过具体的算法示例,展示了栈如何高效地解决这些问题。

栈的经典使用:

1.进制转换

十进制向其他进制转换,涉及到一个基本算法,除模取余。及如下图所示:

假如从十进制n向八进制o转换:

n                n(div)8               n(mod)8

964            120                        4

120             15                         0

15                8                           7

1                   0                         1

即964(n)=1704(o)

简单算法如下:

//进制转换算法
void Conversion(int n, int d)
{
    Stack_Node *s;
    int k, *e;
    s = Init_Stack();
    while(n>0) {//循环取模
      k = n%d;
      push(s,k);//入栈
      n = n/d;
    }
    while(s->top != NULL)
    {
       pop(s,*e);//出栈操作
       printf("%1d",*e);
    }
}
2.括号匹配问题

括号的匹配算法也是栈结构的经典实用例子,基本思想就是设置一个栈,读取括号,如果是左括号,就进栈;如果是右括号就将栈顶的左括号出栈。直到读完所有括号,栈中的存储为空。那么括号就是严格匹配的。

具体算法如下:

//括号匹配问题
#define FALSE -1
#define TRUE  0
SqStack s;
s = Init_Stack();
int Match_Brackets()
{
    char ch, sh;
    scanf("%c",&ch);
    while(int(ch)!=13) {
     if(ch = '(' || ch = '[') {
            push(s,ch);
     } else if(ch = ')') {
        x = pop(s);
        if(x != '(') {
            printf("不匹配!");
            return FALSE;
        }
     } else if(ch = ']') {
       x = pop(s);\
       if(x!='[') {
            printf("不匹配!");
            return FALSE;
       }
     }
    }
    if(s.top != NULL) {
        printf("不匹配!");
        return FALSE;
    }

    return TRUE;

}
3.栈的经典使用之递归算法

学程序的一定听过递归这种算法,核心思想就是利用栈的结构。层层解析入栈,然后层层运算出栈。

递归:一个函数直接或者间接调用自己本身。必须有递归规则,必须有退出条件。

例如求n的阶乘:


可以理解为从n到0一层层入栈,然后将计算后的值层层出栈。具体算法如下:

//n的阶乘
int Fact(int n)
{
    if(n==0)
        return n;
    if(n>0)
        return n*Fact(n-1);
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值