C语言 实现中缀表达式转后缀表达式并求值

由于是初学时写的代码,所以结构比较混乱
重构后的代码在这里,供参考:http://blog.csdn.net/wait_nothing_alone/article/details/70184819


大一菜鸟,初学编程,这是我的第一篇博客,希望能用博客记录我的成长之路。
初学数据结构,刚接触链表和栈,看到有中缀表达式转后缀的题就试着实现了一下。下面贴上代码。因为使用的是字符型变量,所以只能计算个位数。
/* 堆栈练习——中缀表达式转后缀表达式 */
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdbool.h>
#define MAX 25

typedef struct node{
    char date;
    struct node *next;
} LinkStake;

typedef struct node2{
    float date;
    struct node *next;
} Stake;

typedef struct body{
    char date[MAX];
    int j;
} Body;

LinkStake *CreatStake();//建立空栈
int IsEmpty(LinkStake *s);//判断空栈
void Push(char fuhao, LinkStake *s, Body *p);//压栈
int Judge(bool flag, char c);//判断优先级

LinkStake *CreatStake()
{
    LinkStake *s;
    s=malloc(sizeof(struct node));
    s->next = NULL;
    return s;
}

int IsEmpty(LinkStake *s)
{
    return(s->next == NULL);
}

void Push(char fuhao, LinkStake *s, Body *p)
{
    while(s->next != NULL && Judge(false,fuhao)<Judge(true,s->next->date)){
            LinkStake *t;
            printf("%c", s->next->date);
            p->date[p->j] = s->next->date;
            p->j++;
            t = s->next;
            s->next = t->next;
            free(t);
    }
    if(IsEmpty(s)){
        LinkStake *tmp;
        tmp = malloc(sizeof(struct node));
        tmp->date = fuhao;
        tmp->next = s->next;
        s->next = tmp;
    }
    else if(Judge(false,fuhao)>Judge(true,s->next->date)){
            LinkStake *tmp;
            tmp = malloc(sizeof(struct node));
            tmp->date = fuhao;
            tmp->next = s->next;
            s->next = tmp;
        }
    else if(Judge(false,fuhao) == Judge(true,s->next->date)){
            LinkStake *t;
            t = s->next;
            s->next = t->next;
            free(t);
        }
}

int Judge(bool flag, char c)
{
    if(c == '+' || c == '-')
        if(flag) return 3;
        else return 2;
    else if(c == '*' || c == '/')
        if(flag) return 5;
        else return 4;
    else if(c == '(')
        if(flag) return 1;
        else return 6;
    else if(c == ')')
        if(flag) return 6;
        else return 1;
    else return 0;
}

void PushStake(float c, LinkStake* s)
{
    Stake *tmp;
    tmp = malloc(sizeof(struct node2));
    tmp->date = c;
    tmp->next = s->next;
    s->next = tmp;
}

float PopStake(LinkStake *s)
{
    Stake *t;
    float c;
    t = s->next;
    c = t->date;
    s->next = t->next;
    free(t);
    return c;
}

int main()
{
    int i = 0;
    LinkStake *head;
    Body *p = malloc(sizeof(struct body));
    char s[MAX];
    head = CreatStake();
    p->j = 0;

    printf("请输入中缀表达式;\n");
    gets(s);
    printf("转换为后缀表达式: \n");
    while(s[i]){
        if(s[i]>='0' && s[i]<='9'){
            printf("%c", s[i]);
            p->date[p->j] = s[i];
            p->j++;
        }
        else Push(s[i],head,p);
        i++;
    }
    while(head->next != NULL){
        printf("%c", head->next->date);
        p->date[p->j++] = head->next->date;
        p->j++;
        LinkStake *t;
        t = head->next;
        head->next = t->next;
        free(t);
    }
    printf("\n");
    printf("计算结果为:\n");

    Stake *stake;
    float sum = 0.0, a, b;
    stake = (Stake*)malloc(sizeof(struct node2));
    stake->next = NULL;
    for(int i = 0; i < p->j; i++){
        if(p->date[i]>='0' && p->date[i]<='9')
            PushStake((float)(p->date[i]-'0'), stake);
        else if(p->date[i]=='+'){
            b = PopStake(stake);
            a = PopStake(stake);
            sum = a+b;
            PushStake(sum, stake);
        }
         else if(p->date[i]=='-'){
            b = PopStake(stake);
            a = PopStake(stake);
            sum = a-b;
            PushStake(sum, stake);
        }
         else if(p->date[i]=='*'){
            b = PopStake(stake);
            a = PopStake(stake);
            sum = a*b;
            PushStake(sum, stake);
        }
         else if(p->date[i]=='/'){
            b = PopStake(stake);
            a = PopStake(stake);
            sum = a/b;
            PushStake(sum, stake);
        }
    }
    printf("%.2f", sum);
    return 0;
}
  • 14
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值