在linux的shell命令下不知道有没有同学使用dc命令。这是一个算数命令。相信同学们对这种算式都比较熟悉:(1 + 2)* 3结果等于9 dc命令也是一种算式表达——压栈式算术运算。
当输入dc命令后我们像上图那样输入,特点是遇到运算符对前面两个数进行运算,然后再讲结果返回。那么上面的算式就是1和2相加后结果返回,然后遇到乘法后,再将1和2相加的结果与3相乘,摁p输出结果。
仔细看一下这个过程,是不是和压栈很像。过程大体是这样的:
1.数字依次进栈
2.遇到运算符将处于栈顶的两个元素出栈,根据运算符计算出结果,然后再将结果压栈。
3.依次进行指导“p”将结果输出。
当然,这其中还有很多细节,比如后栈里只有单个数字,则自己和自己运算等。我们这里先不考虑这些。只是实现上面简单的功能,做个抛砖引玉,供同学们继续思考深化。
我们看一下下面的程序:
int main(int argc,const char *argv[])
{
int i = 0,x,y;
sqstack * sq;
if((sq = stack_create()) == NULL)
return -1;
while(*argv[i] != 'p')
{
if(*argv[i] <= '9' && *argv[i] >= '0')
push(sq,(*argv[i] - '0'));
if(*argv[i] == '+' || *argv[i] == '-' || *argv[i] == '*' || *argv[i] == '/')
{
y = pop(sq);
x = pop(sq);
printf("x: %d,y:%d\n",x,y);
switch(*argv[i])
{
case '+':
push(sq,x + y);
break;
case '-':
push(sq,x - y);
break;
case '*':
push(sq,x * y);
break;
default:
puts("intput error");
}
}
i++;
// printf("i:%d,%c\n",i,*argv[i]);
}
printf("%d\n",pop(sq));
return 0;
}
在程序中我们用直接从命令行输入的方式。具体的算法就是我们上面描述的那样里面运用的函数栈的创建(stack_create),出栈(push),压栈(pop)等就是我们课上所讲的基础程序。之前也很多同学提出,基础程序熟练了可是就是不知道怎么用。其实在实际中栈和队列的应用还是非常多的,所以希望同学们对所学的多去尝试使用才能熟练。
下面是一个简单的运行效果,同学们可以自己尝试完善一下: