我最近刚学了栈,然后写了一个小程序,目的是将普通表达式转化为逆波兰表达式(后缀表达式),经过多次调试每一步都没问题,但是最后输出结果却是一堆乱码,所以希望有好心人复制以下一段代码在你们的编译器上运行一下看能不能得出正确答案。(代码很长,但是我都检查过了,要是有兴趣可以看一看,只是需要帮助我运行以下再回来告诉我结果就好了,谢谢!!)
要求输入时可以输入2*2,2*5,5/3等简单表达式;
代码:
#include <stdlib.h>
#include <stdbool.h>
#include <ctype.h>
typedef char elemtype ;
typedef struct STACK {
elemtype data ;
struct STACK* next ;
}snode ,*stack ; // 栈结点的声明
stack init() ;
bool isempty(stack s) ;
void push(stack s,elemtype x) ;
elemtype pop(stack s) ;
elemtype readtop(stack s) ;
void destroy(stack s) ;
int priority(char c) ;
char* RPN(char* str) ;
int main()
{
char rpn[20];
printf("请输入一个计算表达式:\n");
gets(rpn);
printf("转化为逆波兰表达式为:\n");
puts(RPN(rpn));
return 0;
}
stack init() {
stack s = (stack)malloc(sizeof(snode)) ;
if(s == NULL) {
printf("头结点内存申请失败\n") ;
return NULL ;
}
s->next = NULL ;
return s ;
}
bool isempty(stack s) {
bool res = false ;
if(s->next == NULL) {
res = true ;
}
return res ;
}
void push(stack s,elemtype x) {
stack n = (stack)malloc(sizeof(snode)) ;
if(n == NULL ) {
printf("栈结点内存申请失败\n") ;
return ;
}
n->data = x ;
n->next = s->next ;
s->next = n ;
}
elemtype pop(stack s) {
if(isempty(s)) {
printf("栈为空,无法输出(后面会跟着输出一个-1可不予理会)") ;
return -1 ;
}
stack n = s->next ;
s->next = n->next ;
elemtype x = n->data ;
free(n) ;
return x ;
}
elemtype readtop(stack s)
{
if(isempty(s)) {
return -1 ;
}
return s->next->data; // 不出栈,只读取栈顶元素,如果栈为空则返回-1
}
void destroy(stack s)
{
stack p;
while (s->next){
p = s->next;
free(s);
s = p;
}
free(s);
}
int priority(char c)
{
int res = 0;
if (c == '*' || c == '/'){
res = 2;
}else if (c == '+' || c == '-'){
res = 1;
}
return res; // 对运算符号的优先级进行划分
}
char* RPN(char* str)
{
char st[20];
char* isrpn = st;
char* rpn = st; // 用rpn来对字符串进行修改
stack s = init();
while (*str){
if (isdigit(*str)){
*(rpn++) = *(str++); // 如果是数字,则直接将*str保存至*rpn
}else{
if (*str == '('){
push(s,*(str++)); // 如果是“(”,则入栈
}else if (*str == ')'){
while (readtop(s) != '('){
*(rpn++) = pop(s); // 如果是“)”,则将栈中“(”和“)”中的所有运算符按出栈顺序保存至*rpn
}
pop(s); // 将“(”出栈,不用保存
str++;
}else{
while (priority(*str) <= priority(readtop(s))){
*(rpn++) = pop(s);
} // 如果是运算符,则与栈顶符号的优先级进行比较,大于它就入栈;小于就让栈顶元素出栈,并重复上述过程
push(s,*(str++));
};
}
}
while (!isempty(s)){
*(rpn++) = pop(s);
} // 最后将栈中全部运算符按出栈顺序保存至*rpn
*rpn = '\0';
return isrpn;
}