1
我一直在試圖調試這個程序很長一段時間。當我輸入表達式 ,比如a + b-c或a/b + c,其中第一個運算符的優先級大於或等於第二個運算符時,它工作正常。但對於像a-b/c這樣的表達式,第一個運算符比第二個運算符具有更低的優先級,編譯器將引發一個斷點。使用C中的鏈接列表插入到postfix實現中
struct stack
{
char ele;
struct stack *next;
};
void push(int);
int pop();
int precedence(char);
struct stack *top = NULL;
int main()
{
char infix[20], postfix[20];
int i=0,j=0;
printf("ENTER INFIX EXPRESSION: ");
gets(infix);
while(infix[i]!='\0')
{
if(isalnum(infix[i]))
postfix[j++]=infix[i];
else
{
if(top==NULL)
push(infix[i]);
else
{
while(top!=NULL && (precedence(top->ele)>=precedence(infix[i])))
postfix[j++]=pop();
push(infix[i]);
}
}
++i;
}
while(top!=NULL)
postfix[j++]=pop();
postfix[j]='\0';
puts(postfix);
getchar();
return 0;
}
int precedence(char x)
{
switch(x)
{
case '^': return 4;
case '*':
case '/': return 3;
case '+':
case '-': return 2;
default: return 0;
}
}
void push(int x)
{
int item;
struct stack *tmp;
if(top==NULL)
{
top=(struct stack *)malloc(sizeof(struct stack));
top->ele=x;
top->next=NULL;
}
else
{
tmp=top;
top->ele=x;
top->next=tmp;
}
}
int pop()
{
struct stack *tmp;
int item;
if(top==NULL)
puts("EMPTY STACK");
else if(top->next==NULL)
{
tmp=top;
item=top->ele;
top=NULL;
free(tmp);
}
else
{
tmp=top;
item=top->ele;
top=top->next;
free(tmp);
}
return item;
}
任何關於如何改善我的編碼的建議將是有幫助的。 感謝您的幫助,我真的很感激:)
當我看到代碼和這樣的任務,我總是感謝上帝被給智能計算機科學家遞歸下降解析器的想法... – 2013-03-02 11:08:27
爲了解析,認爲「樹」。例如,表達式「1 + 2」可以看作一棵以'+'爲根節點的樹,以及'1'和'2'爲子節點。擁有這樣一棵樹後,它很容易以後綴,前綴或中綴表示法輸出。諸如[遞歸下降](http://en.wikipedia.org/wiki/Recursive_descent_parser)之類的技術所做的就是在堆棧中創建該樹,而不是手動創建樹結構,雖然後者更靈活。遞歸下降也非常好。 – 2013-03-02 11:13:50
「編譯器拋出斷點」是什麼意思? – 2013-03-02 12:04:02