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

来源:互联网 发布:明星淘宝店地址 编辑:程序博客网 时间:2024/04/29 07:31
#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 0int 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 100int 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;}