一、问题解析:过程分为两步:
第一步,是将输入的字符串处理,运算符和数字分类储存。
第二部,将中缀转后缀。
二、实现思路
首先来看第一步是如何实现的:
当传入一个字符串,我们需要对字符串的每一个字符根据ASCLL码进行分析 如果ASCLL>47&&ASCLL<58则为数字,其余则为字符,我将这些放入二维数组中。
接着来看第二步是如何实现的: 创建一个栈,再创建一个临时变量保存输出的数组值。
遍历刚才的二维数组,接下来会有两种情况:
- 是数字:那么直接输出到临时变量中
- 是字符:这块又得讨论了。我们不仅要关注字符的优先级还要对于括号进行处理。
a)如果是‘(’那么直接压栈 b)当运算符栈为空或者栈顶操作符的优先级小于当前运算符优先级时直接入栈。 c)当运算符不为空时且栈顶操作符的优先级大于或等于当前运算符优先级时,循环执行出栈操作并加入临时变量中,直到遇到优先级小于当前运算符的元素为止。循环执行完后再将当前运算符压栈。 d)当遇到右括号”)"时,循环执行出栈操作并加入到临时变量中,直到遇到左括号为止。并将左括号弹出,但不加入临时变量中。 e)二维数组遍历完毕时,如果栈里还有运算符,就直接出栈到临时变量。
三、代码实现
第一步代码实现:
Stack inToPost(char *exp)
{
char arr[50][50];
int count=0;
int k=0;
int i=0,j=0;
while(exp[k]!='\0'){
j=0;
if(exp[k]<=47||exp[k]>= 58){
arr[i][j++]=exp[k];
k++;
count++;
arr[i++][j]='\0';
}else if(exp[k]>47&&exp[k]<58){
j=0;
while(exp[k]>47&&exp[k]<58&&exp[k]!='\0'){
arr[i][j++]=exp[k];
k++;
}
arr[i][j]='\0';
i++;
count++;
}
}
.
.
.
}
第二步代码实现
Stack inToPost(char *exp)
{
.
.
.
char newS[100][50]={'\0'};
Stack s=init_stack(100);
j=0;
int num=0;
for(i=0;i<count;i++){
if(arr[i][0]>47&&arr[i][0]<58){
strcat(newS[num++],arr[i]);
continue;
}else if(arr[i][0]<=47||arr[i][0]>= 58){
if(isEmpty(s)||getYouXianJi(peek(s))<getYouXianJi(arr[i])||strcmp(arr[i],"(")==0){
push(s,arr[i]);
}else if(isEmpty(s)==0&&strcmp(arr[i],"(")!=0&&getYouXianJi(peek(s))>=getYouXianJi(arr[i])&&strcmp(arr[i],")")!=0){
while(!isEmpty(s)&&getYouXianJi(peek(s))>=getYouXianJi(arr[i])&&strcmp(arr[i],"(")!=0&&strcmp(arr[i],"(")!=0){
strcat(newS[num++],pop(s));
}
push(s,arr[i]);
}else if(strcmp(arr[i],")")==0){
while(strcmp("(",peek(s))!=0&&isEmpty(s)==0){
strcat(newS[num++],pop(s));
}
pop(s);
}
}
}
while(!isEmpty(s)){
strcat(newS[num++],pop(s));
}
num--;
while(num>=0){
push(s,newS[num]);
num--;
}
return s;
}
我提供的仅仅是一种思路,如果代码有冗余错误欢迎指出,互相学习。 想要完整代码:+V:tjw08230823
|