[英]Stack infix to postfix
我的代碼運行良好,令我驚訝! 唯一的問題是,每當我使用帶括號的中綴輸入時,它都會在后綴表達式的末尾出現一個“ J”! 有什么建議么?? 這里的算法是所有表達式都將被轉換並且基本正確的基本算法,但是尾部的“ J”是我無法理解的! 建議?
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#define MAX 50
char stack[MAX];
int top = -1;
void push(char element)
{
stack[++top] = element;
}
char pop()
{
return(stack[top--]);
}
char tope()
{
return(stack[top]);
}
int prec(char c)
{
switch(c){
case '+':
case '-' : return 1;
break;
case '*' :
case '/' : return 2;
break;
default:
return 0;
break;
}
}
int main()
{
char post[MAX],in[MAX],ch,element;
printf("Infix expression : ");
scanf("%s",in);
int i=0,k=0;
in[strlen(in)] = ')';
push('(');
while((ch = in[i++]) != '\0')
{
if(isalnum(ch))
post[k++] = ch;
if(ch == '(')
push(ch);
if(ch == ')')
{
while(tope() != '(')
{
post[k++] = pop();
}
pop();
}
if(ch == '+' || ch =='-' || ch == '*' || ch == '/')
{
while(prec(ch) <= prec(tope()))
{
post[k++] = pop();
}
push(ch);
}
}
post[k] = '\0';
printf("%s",post);
return 0;
}
in[strlen(in)] = ')';
覆蓋以nul結尾的字符,該字符在打印時解釋奇怪的字符(僅在碰巧遇到另一個nul字符時打印才會停止:未定義的行為,如果in
50字節緩沖區中未找到nul字符,甚至可能導致崩潰)
您必須移動它,例如:
int l = strlen(in);
in[l] = ')';
in[l+1] = '\0';
注意:您必須將字符串的長度存儲在l
而不是兩次調用strlen(in)
,這不僅是因為性能下降,而且因為加上括號意味着strlen
在您以null終止之前無法正常工作。
(您也可能想像這樣保護您的scanf
: scanf("%48s",in);
因此,您一定要為50大小的緩沖區scanf("%48s",in);
出足夠的空間來容納額外的括號,甚至與您的宏定義兼容,請參見scanf:模板,其中包含宏(#define常量 )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.