因为栈的后进先出的特性,栈可以用来解决很多问题,我们接下来处理几个栈应用的典型例子。
例3.1对于一个任意输入的非负十进制数,打印出与其等值的八进制数。
void conversion()
{
initstack(s);
scanf("%d", n);
while (n)
{
push(s, n % 8);
n /= 8;
}
while (!stackempty(s))
{
pop(s, e);
printf("%d", e);
}
}
例3.2写一个程序,如果不是退格或者退行符,压入栈顶,退格弹出,退行清空
void lineedit()
{
initstack(s);
ch = getchar();
while (ch != eof)
{
while (ch != eof && ch != '/n')
{
switch (ch)
{
case'#':pop(s, c);
case'@':clearstack(s);
default:push(s, ch);
}
ch = getchar();
}
clearstack(s);
if (ch != eof)ch = getchar();
}
destroystack(s);
}
例3.3迷宫问题
typedef struct
{
int ord;//路径序号
poptype seat;//坐标位置
int di;//下一个方向
}selemtype;
status mazepath(mazetype maze, postype start, poptype end)
{
initstack(s);
curpos = start;
curstep = 1;
do {
if (pass(curpos))
{
footprint(curpos);
e = (curstep, curpos, 1);
push(s, e);
if (curpos == end) return ture;
curpos = nextpos(curpos, 1);
curstep++;
}
else
{
if (!stackempty(s))
{
pop(s, e);
while (e.di == 4 && !stackempty(s))
{
markprint(e.seat);
pop(s, e);
}
if (e.di < 4)
{
e.di++;
push(e.seat, e.di);
}
}
}
} while (!stackempty(s));
return fault;
}
例3.4 算符号优先问题
operandtype evaluateexpression()
{
initstack(optr);
push(optr, '#');
while (c != '#' && gettop(optr) != '#')
{
if (!in(c, op) {
push(opnd,c);
c=gerchar();
}
else
{
swich(precede(gettop(optr), c))
{
case'<':
push(optr,c);
c=getchar();
break;
case'=':
pop(optr, c);
c = getchar();
break;
case'>':
pop(potr, theta);
pop(opnd, a);
pop(opnd, b);
push(opnd, oprate(a, theta, b));
break;
}
}
}
return gettop(opnd);
}