例1:数制转换(将十进制数N转换为r进制数)
算法思路:
1.N!=0,则重复执行(1)和(2)操作
(1)将N%r进栈s;
(2)N=N/r;
2.将栈s的内容依次出栈,算法结束
typedef int Elemtype;
void conversion(int N,int r)
{
SqStack S; //SqStack以及下面用到的函数见 栈和队列(1)
Elemtype x;
InitStack(S);
while(N)
{
Push(S,N%r);
N=N/r;
}
while(!StackEmpty(S))
{
Pop(S,x);
printf("%d",x);
}
}
例2:括号匹配的检验
算法思路:
依次输入表达式每一个字符,若是左括号,将其入栈保存;若是右括号,则出栈左括号,并检验与其是否匹配。循环执行,直到表达式输入结束。
在检验过程中,若遇到以下几种情况之一,就可以得出括号不匹配的结论。
--当遇到某一个右括号时,栈已空,说明到目前为止,右括号多于左括号;
--从栈中弹出的左括号与当前检验的右括号类型不同,说明出现了括号交叉情况;
--算术表达式输入完毕,但栈中还有没有匹配的左括号,说明左括号多于右括号。
typedef char Elemtype;
int bracketmatching()
{
SqStack S;
Elemtype ch;
InitStack(S);
while((ch=getchar())!="\n")
{
switch(ch)
{
case '(':
case '[':
case '{':
Push(S,ch);break;
case ')':
if(StackEmpty(S)) return FALSE;
else
{
Pop(S,ch);
if(ch!='(') return FALSE;
}
break;
case ']':
if(StackEmpty(S)) return FALSE;
else
{
Pop(S,ch);
if(ch!='[') return FALSE;
}
break;
case '}':
if(StackEmpty(S)) return FALSE;
else
{
Pop(S,ch);
if(ch!='{') return FALSE;
}
break;
default:break;
}
}
if(StackEmtpy(S)) return TRUE;
else return FALSE;
}