数据结构之链式栈的应用-简单表达式计算

#ifndef _HEAD_H_
#define _HEAD_H_

#include <stdio.h>
#include <stdlib.h>

typedef int DataType;
//结点类型
struct node
{
    DataType data;
    struct node *next;
};

//栈头类型
typedef struct 
{
    //记录栈顶结点首地址
    struct node *top;
    //记录栈中元素个数
    int n;
}LinkStack;

extern LinkStack *create_empty_linkstack();
extern int is_empty_linkstack(LinkStack *s);
extern int push_linkstack(LinkStack *s,DataType data);
extern DataType pop_linkstack(LinkStack *s);
extern DataType get_top_data(LinkStack *s);

#endif
#include "head.h"


LinkStack *create_empty_linkstack()
{
    LinkStack *s = NULL;


    s = (LinkStack *)malloc(sizeof(LinkStack));
    s->top = NULL;
    s->n = 0;


    return s;
}


int is_empty_linkstack(LinkStack *s)
{
    return s->top == NULL;
}


int push_linkstack(LinkStack *s,DataType data)
{
    struct node *temp = NULL;


    temp = (struct node *)malloc(sizeof(struct node));
    temp->data = data;


    //链表结点的连接
    temp->next = s->top;


    //更新栈顶指针
    s->top = temp;
    
    s->n++;


    return 0;
}


DataType pop_linkstack(LinkStack *s)
{
    struct node *temp = NULL;
    DataType data;


    temp = s->top;
    data = temp->data;


    s->top = s->top->next;
    s->n--;


    free(temp);


    return data;
}


DataType get_top_data(LinkStack *s)
{
    return s->top->data;
}
#if 0
int main()
{
    LinkStack *s = NULL;
    int i = 0;


    s = create_empty_linkstack();


    for(i = 0;i < 9;i++)
    {
        push_linkstack(s,i);
    }


    printf("top : %d\n",get_top_data(s));


    while(!is_empty_linkstack(s))
    {
        printf("%d ",pop_linkstack(s));
    }
    putchar('\n');


    return 0;
}
#endif
#include "head.h"


#define N 100


int get_priority(char c)
{
    switch(c)
    {
    case '(':
        return 0;
    case '+':
    case '-':
        return 1;
    case '*':
    case '/':
    case '%':
        return 2;
    }


    return -1;
}


void compute(LinkStack *operand,LinkStack *operator)
{
    int data,data1,data2; 


    data2 = pop_linkstack(operand);
    data1 = pop_linkstack(operand);


    switch(pop_linkstack(operator))
    {
    case '+':
        data = data1 + data2;
        break;
    case '-':
        data = data1 - data2;
        break;
    case '*':
        data = data1 * data2;
        break;
    case '/':
        data = data1 / data2;
        break;
    case '%':
        data = data1 % data2;
        break;
    }


    push_linkstack(operand,data);
}


void deal_with(LinkStack *operand,LinkStack *operator,char c)
{
    int cur_level = -1;


    cur_level = get_priority(c);
    //top_level = get_priority(get_top_data(operator));


    while(!(is_empty_linkstack(operator) || cur_level > get_priority(get_top_data(operator))))
    {
        compute(operand,operator);
    }


    push_linkstack(operator,c);


#if 0/*{{{*/
    if(is_empty_linkstack(operator) || cur_level > top_level)
    {
        push_linkstack(operator,c);
    }
    else
    {
        compute();
        goto
    }
#endif/*}}}*/
}


int main()
{
    char buf[N] = {0};
    LinkStack *operand = NULL;//运算数栈
    LinkStack *operator = NULL;//运算符栈
    char *p = buf;
    int data = 0;
    


    printf("Input expression:");
    scanf("%99[^\n]",buf);


    puts(buf);


    operand = create_empty_linkstack();
    operator = create_empty_linkstack();


    while(*p != '\0')
    {
        if(*p == ' ')
        {
            p++;
            continue;
        }


        if(*p >= '0' && *p <= '9')
        { 
            data = 0;
            while(*p >= '0' && *p <= '9')
            {
                data = data * 10 + *p - '0';
                p++;
            }
            //printf("data = %d\n",data);


            push_linkstack(operand,data);
            continue;
        }


        if(*p == '+' || *p == '-' || *p == '*' ||
            *p == '/' || *p == '%')
        {
            deal_with(operand,operator,*p); 
            p++;
            continue;
        }


        if(*p == '(')
        {
            push_linkstack(operator,*p);
            p++;
            continue;
        }


        if(*p == ')')
        {
            while(!is_empty_linkstack(operator) && get_top_data(operator) != '(')
            {
                compute(operand,operator);
            }


            if(is_empty_linkstack(operator))
            {
                printf("( lost.\n");
                return -2;
            }


            pop_linkstack(operator);


            p++;
            continue;
        }


        printf("%c is invalid char.\n",*p);
        return -1;
    }


    while(!is_empty_linkstack(operator))
    {
        compute(operand,operator);
    }


    printf("%s = %d\n",buf,pop_linkstack(operand));


    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值