目录
一、定义头文件
#ifndef _CALCULATE_H_
#define _CALCULATE_H_
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
//定义栈
typedef int DataType;
typedef struct node
{
DataType data;
struct node *next;
}Node;
typedef struct calculator
{
Node *top;
int length;
}calculator;
void InitStack(calculator *c);
void StackPush(calculator *c,DataType value);
int StackIsEmpty(calculator *c);
DataType GetTop(calculator *c);
DataType StackPop(calculator *c);
int Priority(char ch);
void Calculator();
#endif
二、封装函数
#include "calculate.h"
//初始化栈信息
void InitStack(calculator *c)
{
c->length = 0;
c->top = NULL;
}
//入栈
void StackPush(calculator *c,DataType value)
{
if(c == NULL)
{
printf("栈空间分配失败,初始化失败!\n");
return;
}
Node *tmp =(Node *)malloc(sizeof(Node));
tmp->next = NULL;
tmp->data = value;
tmp->next = c->top;
c->top = tmp;
c->length++;
}
//判断栈是否为空
int StackIsEmpty(calculator *c)
{
return c->top == NULL ? 1 : 0;
}
//获取栈顶元素
DataType GetTop(calculator *c)
{
if(c == NULL)
{
return (DataType)-1;
}
if (c->top == NULL)
{
return (DataType)-1;
}
return c->top->data;
}
//出栈
DataType StackPop(calculator *c)
{
if (c == NULL)
{
return (DataType)-1;
}
if (c->top == NULL)
{
return (DataType)-1;
}
Node *tmp = c->top;
c->top = tmp->next;
DataType value = tmp->data;
free(tmp);
tmp = NULL;
c->length--;
return value;
}
//判断符号优先级
int Priority(char ch)
{
switch (ch)
{
case '(':
return 3;
case '*':
case '/':
return 2;
case '+':
case '-':
return 1;
default:
return 0;
}
}
//四则混合计算器
void Calculator()
{
calculator s_sum,s_opt;
InitStack(&s_sum);
InitStack(&s_opt);
char opt[128] = {0};
printf("请输入表达式:\n");
scanf("%s",opt);
int i = 0,tmp = 0;
int num1,num2;
while (opt[i] != '\0' || StackIsEmpty(&s_opt) != 1) //数字
{
if(opt[i] >= '0' && opt[i] <= '9')
{
tmp = tmp * 10 + opt[i] - '0';
i++;
if (opt[i] < '0' || opt[i] > '9')
{
StackPush(&s_sum,tmp);
tmp = 0;
}
}
else //运算符
{
if(StackIsEmpty(&s_opt) == 1 || Priority(opt[i]) > Priority(GetTop(&s_opt)) ||
(GetTop(&s_opt) == '(' && opt[i] != ')'))
{
StackPush(&s_opt,opt[i]);
i++;
continue;
}
if(GetTop(&s_opt) == '(' && opt[i] == ')')
{
StackPop(&s_opt);
i++;
continue;
}
if(Priority(opt[i]) <= Priority(GetTop(&s_opt)) || opt[i] == ')' && GetTop(&s_opt) != '(' ||
opt[i] == '\0' && StackIsEmpty(&s_opt) != 1)
{
switch(StackPop(&s_opt))
{
case '+':
num1 = StackPop(&s_sum);
num2 = StackPop(&s_sum);
StackPush(&s_sum,num1 + num2);
break;
case '-':
num1 = StackPop(&s_sum);
num2 = StackPop(&s_sum);
StackPush(&s_sum,num2 - num1);
break;
case '*':
num1 = StackPop(&s_sum);
num2 = StackPop(&s_sum);
StackPush(&s_sum,num1 * num2);
break;
case '/':
num1 = StackPop(&s_sum);
num2 = StackPop(&s_sum);
StackPush(&s_sum,num2 / num1);
break;
default:
break;
}
}
}
}
printf("%d\n",GetTop(&s_sum));
}
三、主函数
#include "calculate.h"
int main()
{
calculator c;
InitStack(&c);
Calculator();
return 0;
}