C语言栈的应用
程序员文章站
2023-12-25 15:55:51
c语言栈的应用:栈的作用是将递归函数转换成非递归函数,由于在阶乘中只有一个参数,把参数入栈即可。
int nfact(int n)
{
int res = 1;
int temp =...
c语言栈的应用:栈的作用是将递归函数转换成非递归函数,由于在阶乘中只有一个参数,把参数入栈即可。
int nfact(int n) { int res = 1; int temp = 1; pseqstack *stack = null;//控制头指针 createmptystack(&stack, n);//初始化栈 //入栈,模拟函数调用的过程 while(n > 0){ push(stack, n); n = n-1; } //出栈,模拟函数返回过程 while(!isemptystack(*stack)){ res = res*readtop(*stack); pop(stack, &temp); } return res; }利用堆栈进行一位表达式的运算:
在生活中用的是类似(9 * 7) + 8的表达式,这种表达式叫做中缀表达式,表达式利于观察但是不利于计算机计算
我们进行计算的时候输入 9 7 * 8 +,这种方式叫做后缀表达式,它的特点是操作符跟在两个操作数后面,不用括号
所以我们要做的第一件事情就是把中缀表达式转换成后缀表达式;
转换思路:1.读到一个数字则将数字送入到队列中
2.当遇到操作符的时候,将其入栈,每读两个数字时候,出栈一个操作符送入队列中
3.当操作符是左括号时候,此时操作符将一直入栈,直到读到了右括号,出栈所有的操作符,送到左括号中
后缀表达式的计算:
1.在队列种读取到一个数字字符时,将其入栈
2.在队列中读取到一个操作符时,从栈中读取两个操作数进行计算,将结果入栈
3.最后堆栈所剩的唯一一个元素就是运算结果
后缀表达式计算代码(从键盘输入后缀表达式,中缀表达式转换成后缀表达式未来得及用代码实现,下次实现):
#include #include #include typedef char user_type; #include "stack.h" void skipblank(char *str); void getdeal(char *str); void dealalpha(char ch); void getout(); pseqstack *stack = null; void dealalpha(char ch)//前两个元素出栈运算,将运算结果入栈 { char num1 = 0; char num2 = 0; char num3 = 0; switch (ch){ case '+':pop(stack, &num1); pop(stack, &num2); num3 = num2+ num1;//最后打印ascii码的差值,所以 //+的话要减去和96 push(stack,num3); break; case '-':pop(stack, &num1); pop(stack, &num2); num3 = num2 - num1; push(stack,num3); break; case '*':pop(stack, &num1); pop(stack, &num2); num3 = num2 * num1; push(stack,num3); break; case '/':pop(stack, &num1); pop(stack, &num2); num3 = num2 / num1; push(stack,num3); break; } } void skipblank(char *str) { int i = 0, j = 0; for(i = 0; str[i];){puts("sb"); if(str[i] == ' '){//是空格则跳过 i++; }else{ str[j] = str[i];//否则就记录下来 j++;//指向下一个要放入的空间 i++;//指向下一个要取出的字符 } } str[j] = 0;//字符串结束标志 } void getdeal(char *str) { char ch; int i = 0; while(str[i]){ ch = str[i]; if('+' == str[i]||'-' == str[i] ||'/' == str[i]||'*' == str[i]){ dealalpha(ch); i++; }else{ ch = str[i]-48;//转换成ascii数字 push(stack,ch); i++; } } } void getout() { char result = 0; pop(stack, &result); printf("结果:%d\n", result); } int main() { // pseqstack *stack = null; char str[20] = {0}; printf("请输入后缀表达式:\n"); gets(str); skipblank(str);//跳过空格 createmptystack(&stack,strlen(str)); getdeal(str); getout(); return 0; }