linux嵌入式学习——数据结构——栈练习(计算器)

设计一款计算器可以计算公式,可以做到分析加减乘除得优先级

.h

#ifndef LINKSTACK_H
#define LINKSTACK_H


typedef struct{
   int num;
   char sym;
}DATATYPE;

typedef struct LinkStackNode {
    DATATYPE data;
    struct LinkStackNode *next;
}LinkStackNode;

typedef struct{
    LinkStackNode *top;// head
    int clen;
}LinkStackList;

LinkStackList* CreateLinkStackList();
int DestroyLinkStack(LinkStackList*ls);
int PushLinkStack(LinkStackList*ls,DATATYPE* data);
int PopLinkStack(LinkStackList*ls);
int GetSizeLinkStack(LinkStackList*ls);
DATATYPE*GetTopLinkStack(LinkStackList*ls);
int IsEmptyLinkStack(LinkStackList*ls);


#endif // LINKSTACK_H

.c

#include "linkstack.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
LinkStackList *CreateLinkStackList()
{
   LinkStackList *ls=(LinkStackList*)malloc(sizeof(LinkStackList));
   if(NULL == ls)
   {
       perror("CreateLinkStackList malloc");
       return NULL;
   }
   ls->top =NULL;
   ls->clen = 0 ;
   return ls;

}

int PushLinkStack(LinkStackList *ls, DATATYPE *data)
{
    LinkStackNode* newnode = malloc(sizeof(LinkStackNode));
    if(NULL == newnode)
    {
        perror("PushLinkStack malloc");
        return 1;
    }
    memcpy(&newnode->data,data,sizeof(DATATYPE));
    newnode->next = NULL;
    if(IsEmptyLinkStack(ls))
    {
        ls->top = newnode;
    }
    else
    {
        newnode->next = ls->top;
        ls->top = newnode;
    }
    ls->clen++;
    return 0;
}

int PopLinkStack(LinkStackList *ls)
{
    if(IsEmptyLinkStack(ls))
    {
        return 1;
    }
    LinkStackNode* tmp = ls->top;
    ls->top = ls->top->next;
    free(tmp);
    ls->clen--;
    return 0 ;
}

int IsEmptyLinkStack(LinkStackList *ls)
{
    return 0 == ls->clen;
}

int GetSizeLinkStack(LinkStackList *ls)
{
    return ls->clen;
}

DATATYPE *GetTopLinkStack(LinkStackList *ls)
{
    if(IsEmptyLinkStack(ls))
        return NULL;
    return &ls->top->data;
}

int DestroyLinkStack(LinkStackList *ls)
{
    int len = GetSizeLinkStack(ls);
    int i = 0 ;
    for(i = 0 ;i<len;i++)
    {
        PopLinkStack(ls);
    }
    free(ls);
    return 0;
}

main.c

#include <stdio.h>
#include "linkstack.h"
#include <string.h>
int num = 0;
void get_num(char c)
{

    num = num*10 + c-'0';
}
int get_pority(char c)
{
    switch (c) {
    case '+':
        return 1;
        break;
    case '-':
        return 1;
        break;
    case '*':
        return 2;
        break;
    case '/':
        return 2;
        break;
    default:
        return 2;
        break;
    }
}
int get_result(int num1,int num2,char c)
{

    switch (c) {
    case '+':
        return num1+num2;
        break;
    case '-':
        return num1-num2;
        break;
    case '*':
        return num1*num2;
        break;
    case '/':
        return num1/num2;
        break;
    default:
        break;
    }
    return -1;
}
int main()
{
    char express[]="3*20+6";//\0
    LinkStackList *ls_num = CreateLinkStackList();
    LinkStackList *ls_sym = CreateLinkStackList();

    char * tmp = express;
    DATATYPE data;
    int flag = 0;
    while(*tmp)
    {
        bzero(&data,sizeof(data));
        if(*tmp>='0' &&*tmp<='9')
        {
            get_num(*tmp);
            tmp++;
            continue;
        }

        if(0 == flag)
        {
            data.num = num;
            PushLinkStack(ls_num,&data);
            num  = 0 ;

        }



        DATATYPE* tmp_top = GetTopLinkStack(ls_sym);
        if(IsEmptyLinkStack(ls_sym) || get_pority(*tmp) >   get_pority(tmp_top->sym) )
        {
            bzero(&data,sizeof(data));
            data.sym = *tmp;
            PushLinkStack(ls_sym,&data);
            flag = 0 ;
        }
        else
        {

            //取2个操作数出来
            tmp_top = GetTopLinkStack(ls_num);
            int num2 = tmp_top->num;
            PopLinkStack(ls_num);
            tmp_top = GetTopLinkStack(ls_num);
            int num1 =tmp_top->num ;
            PopLinkStack(ls_num);

            tmp_top = GetTopLinkStack(ls_sym);
            char c=tmp_top->sym;
            PopLinkStack(ls_sym);

            int result = get_result(num1,num2,c);
            bzero(&data,sizeof(data));
            data.num = result;
            PushLinkStack(ls_num,&data);
            flag =1;
            continue;
        }

        tmp++;
    }
    bzero(&data,sizeof(data));
    data.num = num;
    PushLinkStack(ls_num,&data);


    while(!IsEmptyLinkStack(ls_sym))
    {
        DATATYPE*tmp_top = GetTopLinkStack(ls_num);
        int num2 = tmp_top->num;
        PopLinkStack(ls_num);
        tmp_top = GetTopLinkStack(ls_num);
        int num1 =tmp_top->num ;
        PopLinkStack(ls_num);

        tmp_top = GetTopLinkStack(ls_sym);
        char c=tmp_top->sym;
        PopLinkStack(ls_sym);

        int result = get_result(num1,num2,c);
        bzero(&data,sizeof(data));
        data.num = result;
        PushLinkStack(ls_num,&data);
    }
    DATATYPE*tmp_top = GetTopLinkStack(ls_num);
    int num2 = tmp_top->num;
    printf("result is %d\n",num2);
    printf("Hello World!\n");
    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值