第2关:中缀表达式转换为后缀表达式
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
struct stack
{
int top;
char *head;
};
typedef struct stack* Stack;
Stack init(Stack s){
s = (Stack)malloc(sizeof(struct stack));
s -> top = 0;
s -> head = (char *)malloc(sizeof(char)*85);
return s;
}
int isEmpty(Stack s){
if(s->top == 0) return 1;
return 0;
}
int isFull(Stack s){
if(s->top == 85) return 1;
return 0;
}
void push(Stack s,char ch){
if(!isFull(s)){
s->head[s->top] = ch;
s -> top ++;
}
}
char top(Stack s){
return s->head[s->top-1];
}
void pop(Stack s){
if(!isEmpty(s)){
s -> top --;
}
}
int isNumber(char ch){
if(ch<='9'&&ch>='0'){
return 1;
}return 0;
}
void dealRight(Stack temp){
char ch;
while((ch = top(temp))!='('){
putchar(ch);
pop(temp);
}
}
int isAddOrSub(char ch){
if(ch == '+'||ch=='-') return 1;
return 0;
}
void dealHigh(Stack temp,char sign){
char ch;
while (!isAddOrSub(ch = top(temp))&&!isEmpty(temp)) {
putchar(' ');
putchar(ch);
pop(temp);
}
push(temp, sign);
}
void dealLow(Stack temp,char sign){
while(!isEmpty(temp)){
putchar(' ');
putchar(top(temp));
pop(temp);
}
push(temp,sign);
}
Stack inToPost(char *expression)
{
unsigned long length = strlen(expression);
Stack temp = NULL;
temp = init(temp);
int i = 0;
while(i!=length){
if(isNumber(expression[i])){
if(isNumber(expression[i-1])||isEmpty(temp))
putchar(expression[i]);
else{
putchar(' ');
putchar(expression[i]);
}
}
else if(expression[i]=='(') push(temp, '(');
else if(expression[i]==')') dealRight(temp);
else if(isAddOrSub(expression[i])) dealLow(temp, expression[i]);
else if(expression[i]=='*'||expression[i]=='/') dealHigh(temp,expression[i]);
i++;
}
return temp;
}
void print(Stack s){
while(!isEmpty(s)){
putchar(' ');
putchar(top(s));
pop(s);
}
}