用c语言利用栈将中缀表达式转化为后缀表达并计算
先是头文件
#ifndef CALCULATOR_H_INCLUDED
#define CALCULATOR_H_INCLUDED
//存取后缀表达式的链表节点
typedef struct expression
{
char c ;
double a ;
struct expression *prior;
struct expression *next;
}E;
//字符栈
typedef struct StackNode
{
char c;
struct StackNode *next;
}StackNode, *LinkStackPtr;
typedef struct LinkStack
{
LinkStackPtr top;
}LinkStack;
typedef enum Status
{
ERROR = 0,
SUCCESS = 1
} Status;
//检查输入是否合法
Status ChekStr(char *str);
//输入函数
void s_gets(char *str);
//将中缀表达式转化为后缀表达式
void Change(char *str,E *h,LinkStack *s);
//入栈
void pushLStack(LinkStack *s,char c);
//出栈
void popLStack(LinkStack *s);
//延长存储后缀表达式的链表
void createNext(E *p);
//计算后缀表达式
void answer(E *h);
//销毁链表
void DestroyList(E *h);
#endif // CALCULATOR_H_INCLUDED
接口的实现
#include "calculator.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//输入函数
void s_gets(char * str)
{
fflush(stdin);
char * ret_val;
char * find;
ret_val = fgets(str,100,stdin);
if(ret_val)
{
find = strchr(str,'\n');
if(find) *find = '\0';
else
while (getchar() != '\n')
continue;
}
}
//检查表达式是否合法
Status ChekStr(char *str)
{
int flag = 1;//标记字符前面非数字符号出现次数
int right =0;//计算右括号
int left = 0;// 计算左括号
int wei = 0; //计算数字位数
int point = 0;
char *arr = str;
while (*arr != '\0'){
if (*arr >= '0' && *arr <= '9')
{
flag = 0;wei++;
if (wei == 1) point = 0;
if(wei >= 12