您的位置:首页 > 理论基础 > 数据结构算法

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

2017-11-03 15:14 309 查看
栈的经典使用:

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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: