利用栈将中缀表达式转为后缀表达式
算法思想
- 顺序扫描中缀表达式(可以存储在字符数组中)
- 判断当前元素类型:
- 如果是数字,直接加入后缀表达式序列中(可以用数组或队列存储)
- 如果是" ( ",将其存入字符栈中
- 如果是" ) ", 字符栈出栈,直到遇到 " ( " 为止, "(" 也出栈,注意"("不需要存入后缀表达式数组中
- 如果是其它符号
- 如果该符号比当前栈顶的符号的优先级高,则直接入栈
- 否则字符栈出栈,直到栈顶符号的优先级比该元素低(优先级相同的也得出栈)
需要注意的知识点
字符串的初始化方法
- 1.定义的时候直接用字符串赋值
char a[10]="hello";
- 注意:不能先定义再给它赋值,如
char a[10]; a[10]="hello";
这样是错误的! - 另外 字符数组最后一个元素为'\0',所以字符数组的长度要比输入的字符串长度至少大1!比如
char[6]="hello";
但是如果是挨个赋值的话则不用 比如char[2]={'a','b'};
遍历数组最好要while(char[i]!='\0')
的方法,因为求数组长度sizeof(arr)/sizeof(arr[0])
得到的是初始化分配的长度,而不是后来往里面填充的元素个数
- 2.对数组中字符逐个赋值
char a[10]={'h','e','l','l','o'};
- 注意:大括号里的元素不能用""括起来,只能用''
- 3、利用
strcpy
char a[10]; strcpy(a, "hello");
STL中栈stack的使用
- 注意STL中,
S.pop()
不会返回弹出的栈顶值,需要用S.top()
取 - 出栈和取栈顶前先判断栈是否为空
代码
#include<stdio.h>
#include<iostream>
#include<stack>
using namespace std;
bool mitToPost(char *exp,char *posExp,int len);
int main(){
char exp[16]="a/b+(c*d-e*f)/g";
//char exp[15] = {'a','/','b','+','(','c','*','d','-','e','*','f',')','/','g'};
int len = sizeof(exp)/sizeof(exp[0]);
// printf("%d",len);//按第一种初始化方法,结果是16
// if(exp[15]==NULL) //会返回true
// printf("hei");
// if(exp[15]=='\0') //会返回true
// printf("hoo");
char posExp[16];
//int posLen=sizeof(posExp)/sizeof(posExp[0]);//得到的是16,即分配的长度
bool res = mitToPost(exp,posExp,len);
int i=0;
while(posExp[i]!='\0'){
printf("%c",posExp[i]);
i++;
}
return 0;
}
bool mitToPost(char *exp,char *posExp,int len){
stack <char> S;
int i=0,j=0;
if(len==0) return false;
while(exp[i]!='\0'){//扫描前缀表达式
//for(i=0;i<len;){ //这样写也可以
switch(exp[i]){
case '(':
S.push(exp[i]);
break;
case ')':
while(!S.empty()&&S.top()!='('){
posExp[j++]=S.top();
S.pop();
}
//posExp[j++]=S.top();
S.pop();//把'('也弹出来,但是不用存到后缀表达式中
break;
case '*':
case '/':
while(!S.empty() && S.top()!='-'&&S.top()!='+'&&S.top()!='('){
posExp[j++]=S.top();
S.pop();
}
S.push(exp[i]);
break;
case '+':
case '-':
while(!S.empty()&&S.top()!='('){
posExp[j++]=S.top();
S.pop();
}
S.push(exp[i]);
break;
default:
posExp[j++]=exp[i];
break;
}
i++;
}
while(!S.empty()){
posExp[j++]=S.top();
S.pop();
}
return true;
}
参考资料
[1] C语言给字符数组赋值的方法
[2] STL栈stack的使用
[3] 《王道-数据结构》-3.3栈和队列的应用
网友评论