欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C语言栈的应用

程序员文章站 2023-02-02 09:39:43
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;
}