#include
#include
struct stack{
char *data;
int top;
int maxSize;
};
struct stack *createStack(int maxsize){
struct stack *s;
s=(struct stack *)malloc(sizeof(struct stack));
s->data=(char *)malloc(sizeof(char)*maxsize);
s->top=-1;
s->maxSize=maxsize;
return s;
}
int isFull(struct stack *s){
return s->top==s->maxSize-1;
}
int isEmpty(struct stack *s){
return s->top==-1;
}
void push(struct stack *s,char ch){
if(isFull(s)){
printf("stack is fulln");
return;
}
s->data[++s->top]=ch;
}
char pop(struct stack *s){
if(isEmpty(s)){
printf("stack is emptyn");
exit(-1);
}
return s->data[s->top--];
}
struct queue{
char *data;
int front,rear;
int size;
int maxsize;
};
struct queue *create(int maxSize){
struct queue *q;
q=(struct queue *)malloc(sizeof(struct queue));
q->data=(char *)malloc(sizeof(char)*maxSize);
q->front=q->rear=0;
q->size=0;
q->maxsize=maxSize;
return q;
}
void inqueue(struct queue *q,char ch){
if(q->size==q->maxsize){
printf("queue is fulln");
return;
}
q->data[q->rear++]=ch;
if(q->rear==q->maxsize){
q->rear=0;
}
q->size++;
}
char dequeue(struct queue *q){
if(q->size==0){
printf("queue is emptyn");
exit(-1);
}
char temp = q->data[q->front++];
if(q->front==q->maxsize){
q->front=0;
}
q->size--;
return temp;
}
void PrintQueue(struct queue *q){
int temp=q->front;
for(int i=0;isize;i++){
printf("%ct",q->data[temp++]);
temp=temp%q->maxsize;
}
}
int no_priority(int map[4][4],char ch1,char ch2){
int i,j;
switch(ch1){
case '+':i=0;break;
case '-':i=1;break;
case '*':i=2;break;
case '/':i=3;break;
default:printf("error.");
}
switch(ch2){
case '+':j=0;break;
case '-':j=1;break;
case '*':j=2;break;
case '/':j=3;break;
default:printf("error.");
}
return map[i][j];
}
int main(){
int map[4][4]={
1,1,1,1,
1,1,1,1,
0,0,1,1,
0,0,1,1,
};
struct stack *s;
int n=20;
s=createStack(n);
char str[n];
printf("请输入中缀表达式:");
scanf("%s",str);
struct queue *q;
q=create(n);
int k=0;
while(str[k]!=' '){
if(str[k]>=48&&str[k]<=57){
inqueue(q,str[k]);
}else if(isEmpty(s)||str[k]=='('){
push(s,str[k]);
}else if(str[k]==')'){
char ch=pop(s);
while(ch!='('){
inqueue(q,ch);
ch=pop(s);
}
}else{
while(!isEmpty(s)&&s->data[s->top]!='('&&no_priority(map,str[k],s->data[s->top])){
char ch=pop(s);
inqueue(q,ch);
}
push(s,str[k]);
}
k++;
}
while(!isEmpty(s)){
char ch=pop(s);
inqueue(q,ch);
}
printf("后缀表达式:n");
PrintQueue(q);
return 0;
}