如題,代碼如下,歡迎探討!!!
[code=C/C++][/code]
/* 表達式的後綴表示及其求值 */
#include <stdio.h>
typedef int ElemType; /* 考慮到char型運算時的隱形提升會溢出,此處定義為int,代價僅浪費了內存空間 */
#define MAXNUM 16
struct stack
{
ElemType data[MAXNUM];
int top;
};
void StackInit(struct stack *stack)
{
int i = 0;
for(;i < MAXNUM;i++)
{
stack->data[i] = 0;
}
stack->top = 0; /* 棧底部從索引0處開始 */
}
void StackPush(struct stack *stack,ElemType c)
{
if(MAXNUM == stack->top) /* 棧中元素最多有MAXNUM - 1個 */
{
printf("The stack is full
");
return;
}
stack->data[stack->top++] = c;
}
ElemType StackPop(struct stack *stack)
{
if(0 == stack->top)
{
printf("The stack is empty
"); /* 當棧空時,若返回0是錯誤的 */
return 0;
}
return stack->data[--stack->top];
}
void PostfixEvaluation(struct stack *stack)
{
return; /* 這個函數非常簡單了,所有的麻煩都已經解決了,我實在不想完成它 */
}
int ChangeToPostfix(char *str)
{
int i = 0,flag = 0; /* flag 用來標記連續數字的出現,沒想到好點的辦法 */
int c,ch;
struct stack ch_stack;
struct stack op_stack;
StackInit(&ch_stack);
StackInit(&op_stack);
while( != (c = *(str + i))) /* 此處需注意的是:如果是靜態的字符串,以為結束條件,如果是用戶輸入的,則以
’為結束條件 */
{
if((* == c) || (/ == c) || (( == c))
{
flag = 0;
StackPush(&op_stack,c);
}
else if() == c)
{
flag = 0;
while(( != (c = StackPop(&op_stack)))
{
StackPush(&ch_stack,c);
}
if(0 == op_stack.top)
{
printf("the ( hasnt found when the ) come in!
");
return -1;
}
}
else if((+ == c)|| (- == c))
{
flag = 0;
/* +和-優先級低,運算符棧中的((如果存在)後的所有運算符需推出 */
if(0 != op_stack.top) /* 你可以不在此處添加top的檢查,那樣,你可以發現 StackPop錯誤返回的0被拾取了 */
{ /* 被逼無奈,只得在此檢查top值,無法寄希望於StackPop了 */
while(( != (ch = StackPop(&op_stack)))
{
StackPush(&ch_stack,ch);
if(0 == op_stack.top)
{
break;
}
}
}
StackPush(&op_stack,c);
}
else if((c >= 0) && (c <= 9)) /* 對於表達式中2位或多位連續的數字,需特殊處理 */
{
if(0 == flag)
{
StackPush(&ch_stack,(c - 0));
flag = 1;
}
else
{
StackPush(&ch_stack,10 * StackPop(&ch_stack) + (c - 0));
}
}
i++;
}
while(0 != op_stack.top) /* 表達式處理結束,將運算符棧中的所有運算符推出並壓入字符棧 */
{
StackPush(&ch_stack,StackPop(&op_stack));
}
PostfixEvaluation(&ch_stack); /* 該函數放在此處可能較為欠妥,可是,只要完成了任務不就OK了麼,難道你會在乎? */
/*just test */
for(i = 0;i < ch_stack.top;i++)
{
if(+ == ch_stack.data[i])
{
printf("+..");
}
else if(- == ch_stack.data[i])
{
printf("-..");
}
else if(* == ch_stack.data[i])
{
printf("*..");
}
else if(/ == ch_stack.data[i])
{
printf("/..");
}
else
{
printf("%d..",ch_stack.data[i]);
}
}
return 0;
}
int main(void)
{
char str[] = "12 + 34 * 435 - 5 / 1";
/* just test */
printf("The result should be :
");
printf("12 34 435 * + 5 1 / - [= 8]
");
if(-1 == ChangeToPostfix(str))
{
printf("ChangeToPostfix() error
");
return 1;
}
return 0;
}