将算数表达式a+b+c*d转换成后缀表达式ab+cd*+,就可以利用栈来实现这种有优先级的运算,因此首先可以使用栈来将一种表达式转化成对应的后缀表达式。
下面是实现的转换算法,注意不能带括号,支持+-*/运算符,stack的实现我可以去掉了错误检测,因为默认已经声明好了足够大小的栈。
栈头文件stack.h
1 /*数组栈*/ 2 #include "iostream" 3 #include "stdlib.h" 4 5 #define minSize 5 6 #define emptyStack -1 7 #define fullStack -2 8 #define log(s); std::cout<<s<<std::endl; 9 10 typedef struct _stack_ 11 { 12 int capacity; 13 int topOfStack; 14 char *Array; 15 }stack; 16 17 stack *createStack(int maxSize) 18 { 19 stack *s; 20 if (maxSize < minSize) 21 { 22 return nullptr; 23 } 24 s = (stack *)malloc(sizeof(stack)); 25 s->Array = (char *)malloc(sizeof(char) * maxSize); 26 s->capacity = maxSize; 27 s->topOfStack = emptyStack;/*初始化为空栈*/ 28 return s; 29 } 30 31 int isEmpty(stack *s)/*是否为空栈*/ 32 { 33 return s->topOfStack == emptyStack; 34 } 35 36 void push(stack *s, char data)/*压栈*/ 37 { 38 ++s->topOfStack; 39 s->Array[s->topOfStack] = data; 40 } 41 42 void pop(stack *s)/*弹出栈*/ 43 { 44 if (isEmpty(s)) 45 { 46 return; 47 } 48 --s->topOfStack; 49 } 50 51 char top(stack *s)/*访问栈顶元素*/ 52 { 53 if (isEmpty(s)) 54 { 55 return emptyStack; 56 } 57 return s->Array[s->topOfStack]; 58 } 59 60 void makeEmpty(stack *&s)/*置空栈*/ 61 { 62 free(s->Array); 63 free(s); 64 s = nullptr; 65 }
主函数main.cpp
1 #include "stack.h" 2 #include "string" 3 4 int isSymbal(char s) 5 { 6 if (s == ‘+‘ || s == ‘*‘||s==‘-‘||s==‘/‘) 7 { 8 return 1; 9 } 10 return 0; 11 } 12 13 int isBigger(char s1,char s2)//比较是否 s1不比s2 的优先级低 14 { 15 if (s1 == ‘*‘||s1==‘/‘)//*有最高优先级 16 { 17 return 1; 18 } 19 else 20 { 21 if (s2 == ‘*‘||s2==‘/‘) 22 { 23 return 0; 24 } 25 else 26 return 1; 27 } 28 } 29 30 int main(void) 31 { 32 stack *st = createStack(10); 33 std::string s; 34 std::cin >> s; 35 char i; 36 for (auto &i:s) 37 { 38 if (isSymbal(i)) 39 { 40 if (isEmpty(st))//是空栈的时候 41 { 42 push(st, i); 43 } 44 else//不是空栈的时候 45 { 46 if (!isBigger(top(st), i))//栈顶的字符是否比较新读取的字符优先级不小 47 { 48 push(st,i); 49 } 50 else 51 { 52 std::cout << top(st) << " "; 53 pop(st); 54 push(st, i); 55 } 56 } 57 continue; 58 } 59 std::cout << i << " "; 60 } 61 while (!isEmpty(st)) 62 { 63 std::cout << top(st) << " "; 64 pop(st); 65 } 66 std::cout << "" << std::endl; 67 system("pause"); 68 return 0; 69 }
我使用的结果是这样:
如有错误,请读者指出,不胜感激。
以上。
时间: 2024-08-12 06:44:10