C语言栈的应用

2016-12-24 08:35:10来源:作者:人点击

第七城市

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#includetypedef 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;}
第七城市

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台