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

来源:互联网 发布:mariadb与mysql的语法 编辑:程序博客网 时间:2024/05/17 09:12

栈的经典使用:

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  0SqStack 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);}




阅读全文
0 0
原创粉丝点击