《数据结构与算法分析》练习题系列。
中缀转换成后缀的算法书上写的非常详细了,在做练习题时我就按照书上的思路用c写了一遍,但有个小错误没注意,所以一直报错,调了半天,终于好了。。。
废话不多说,程序是用栈的数组形式实现的,结构体是这样的:
#define Error -1
struct StackRecord;
typedef struct StackRecord *Stack;
typedef char ElementType;
struct StackRecord
{
int Capacity;
int TopOfStack;
ElementType *Array;
};
程序已修改,添加了幂操作符。
一般的操作符运算顺序是从左到右,比如对减法:a-b-c,是先算a-b,然后用结果-c,但幂运算的顺序是从右到左,比如2^3^2,结果是512而不是64(我用手机算的是512,后来拿计算器算了一下发现是64,擦汗。。。但为了区分一般的运算符,我们假设‘^’是从右到左运算的,否则就没啥意思了,我们的目的是探究输入条件变化时算法的变化不是吗,嘿嘿。。。),所以‘^’运算符在进栈时,如果栈顶符号也是‘^’,则不弹出,而是进栈。
下面是中缀转换成后缀的代码:
/*中缀表达式转换为后缀表达式*/
char(*InfixToPostfix(char *str))[100]
{
int count;
char(*output)[100];
Stack S;
S = CreatStack(100);//创建一个堆栈
count = 0;//输出符号流计数
output = calloc(100, sizeof(char));//为输出符号流创建空间
for (int i = 0; i < 100; i++)//初始化
*output[i] = '\0';
/*主程序*/
for (int i = 0; str[i] != '\0'; i++)
{
if (str[i] != '+' && str[i] != '-' && str[i] != '*' && str[i] != '/' && str[i] != '(' && str[i] !=