/*
棧採用順序棧儲存,試設計演算法實現將表示式轉換成字尾表示式輸出。
例如,輸入表示式: a+b/c-(d*e+f)*g
輸出其字尾表示式: abc/+de*f+g*-
*/#include #include #define true 1
#define false 0
#define ok 1
#define error 0
#define infeasible -1
#define overflow -2
#define stack_init_size 100
#define stackincrement 10
typedef int status;
typedef char selemtype;
typedef struct
sqstack;
status initstack(sqstack &s);
status push(sqstack &s, selemtype &e);
status pop(sqstack &s, selemtype &e);
status gettop(sqstack s, selemtype &e);
status matching(sqstack &s, char expression);
int stacklength(sqstack s);
int main()
status initstack(sqstack &s)
s.top = s.base;
s.stacksize = stack_init_size;
return ok;
}int stacklength(sqstack s)
status gettop(sqstack s, selemtype &e)
//不可以用s.top - 1,因為這裡只是讀取,並非刪除
e = *(s.top - 1);
return ok;
}status push(sqstack &s, selemtype &e)
//指標的加減量實際上就是在位址上以對應的型別空間的移動
s.top = s.base + s.stacksize;
s.stacksize += stackincrement;
} //e作為棧頂元素,先賦值,再向上移動
*s.top++ = e;
return ok;
}status pop(sqstack &s, selemtype &e)
//棧頂元素被忽略,讀取後棧頂指標下移
e = *--s.top;
return ok;
}status matching(sqstack &s, char expression)
else
}if (flag == 1)
break;
}case '*':
case '/':
flag = 1;
gettop(s, e);
if (stacklength(s) == 0 || e == '(' || e == '+' || e == '-')
else
if (flag == 1)
break;
}case '(':
flag = 1;
push(s, expression[index]);
break;
case ')':
flag = 1;
if (stacklength(s))
}break;
}else
return error;
default:
printf("%c ", expression[index]);
} }if (stacklength(s) != 0)
} return ok;
}
字尾表示式 棧
若干行,每行對應乙個中綴表示式 若干行,每行對應乙個由中綴表示式轉換而來的字尾表示式 x a y b z f a b c d m n s t y a b c d e f gxayb zf abc dm n st y abc def g 解題思路 首先如何實現中綴表示式轉換成字尾表示式,方法如下 1....
棧 字尾表示式
看了老師給的部落格,學習了一下,我學的確實很菜啊,仿照寫了乙個可以實現任意數字個數的加括號運算,目前只支援加乙個括號。收穫真的挺大 def to rpn f4 defcompare x,y v return 1 if y else v x v y rpn,operators for i in f4 ...
棧的應用之後綴表示式求值
字尾表示式,指的是不包含括號,運算子放在兩個運算物件的後面,所有的計算按運算子出現的順序,嚴格從左向右進行 不再考慮運算子的優先規則 我們數學上採用的表示式叫中綴表示式,即將運算放在兩個運算物件中間。此外還有字尾表示式,即將運算子放在兩個運算物件的前面。下面是同乙個算術表示式的三種等價表示形式 中綴...