设计一款计算器可以计算公式,可以做到分析加减乘除得优先级
.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;
}