这是这两天写的第二个项目,准确的来书我还没有完全掌握,很多地方都是借鉴的老师讲的和网上一些代码。
而且这个程序我写了很多头文件和函数文件,还不怎么好发。
我整理了一下,决定就发几个头文件和几个核心函数。
先是主函数
#include<stdio.h>
#include<stdlib.h>
#include"NumStack.h"
#include"CharStack.h"
#include"judge.h"
#include"error.h"
#define MAX 100
int main()
{
NUM_STACK num; //创建数字栈
CHAR_STACK ch; //创建字符栈
//清空栈
Init_CharStack(&ch);
Init_NumStack(&num);
char str[MAX]; //存放输入字符
char num_str[MAX];
char x;
gets(str);
int i = 0,t;
while (str[i])
{
if (jud_num(str[i]) == TRUE) //判断是否是数字
{
t = 0;
while(jud_num(str[i]) == TRUE)
{
num_str[t] = str[i];
i++;
t++;
}
num_str[t] = '\0'; //获取数字字符串
Push_Num(&num,atoi(num_str)); //将字符串转化为整数
}
else //剩余是运算符的情况
{
if(jud_ch(&ch,str[i]) == IN) //判断是否要入栈
{
Push_Char(&ch,str[i]);
}
else
{
if(str[i] != ')') //右括号特别考虑
{
counter(&num,&ch);
Push_Char(&ch,str[i]);
}
else //考虑右括号
{
do
{
counter(&num,&ch);
}
while(ch.ch[ch.top] != '(');
Pop_Char(&ch,&x);
}
}
i++;
}
}
while(ch.top != -1) //最后所有预算符全部出栈
{
counter(&num,&ch);
}
printf("%d\n",num.num[num.top]);
return 0;
}
然后是判断函数
#include"judge.h"
//判断是否是数字
int jud_num(char ch)
{
if(ch >= '0' && ch <= '9')
return TRUE;
return FALSE;
}
//判断预算符是否要入栈
int jud_ch(CHAR_STACK *s,char ch)
{
if(s->top == -1)
return IN;
else
{
if (Char_Full (s) == TRUE)
return FALSE;
switch(s->ch[s->top])
{
case '+': //在'+'和'-'的时候,'*','/','('进栈。
case '-':
if (ch == '+' || ch == '-' || ch == ')')
return OUT;
else return IN;
break;
case '*': //在'*'和'/'的时候,'('进栈。
case '/':
if (ch == '(')
return IN;
else return OUT;
break;
case '(': //在'('的时候,全部进栈
return IN;
break;
default :
break;
}
}
return TRUE;
}
运算函数
#include"counter.h"
//运算
void counter(NUM_STACK * n,CHAR_STACK * c)
{
int a ; //第一个数出栈
Pop_Num(n,&a);
int b ; //第二个数出栈
Pop_Num(n,&b);
char ch ;
Pop_Char(c,&ch); //第一个字符出栈
int result;
switch(ch)
{
case '+':
result = a + b;
break;
case '-':
result = b - a; //同下
break;
case '*':
result = b * a;
break;
case '/':
result = b / a; //这里要b/a,因为a是后入栈的
break;
default :
break;
}
Push_Num(n,result);
return ;
}
最后是这种头文件
#ifndef __CHARSTACK_H__
#define __CHARSTACK_H__
#define FALSE 0
#define TRUE 1
#define CHAR_SIZE 100
typedef struct char_stack
{
char ch[CHAR_SIZE];
int top;
}CHAR_STACK;
//清空栈
int Init_CharStack(CHAR_STACK * s);
//判断是否空栈
int Char_Empty (CHAR_STACK * s);
//判断是否满栈
int Char_Full (CHAR_STACK * s);
//入栈
int Push_Char(CHAR_STACK * s,char x);
//出栈
int Pop_Char(CHAR_STACK * s,char *x);
// 取栈顶
int GetTop_Char (CHAR_STACK *s, char *x);
#ifndef __NUMSTACK_H__
#define __NUMSTACK_H__
#define FALSE 0
#define TRUE 1
#define NUM_MAX 100
typedef struct num_stack
{
int num[NUM_MAX];
int top;
}NUM_STACK;
//清空栈
int Init_NumStack(NUM_STACK * s);
//判断是否空栈
int Num_Empty (NUM_STACK * s);
//判断是否满栈
int Num_Full (NUM_STACK * s);
//入栈
int Push_Num(NUM_STACK * s,int x);
//出栈
int Pop_Num(NUM_STACK * s,int *x);
// 取栈顶
int GetTop_Num (NUM_STACK *s, int *x);
#ifndef __JUDGE_H__
#define __JUDGE_H__
#include"CharStack.h"
#define FALSE 0
#define TRUE 1
#define IN 2
#define OUT 3
//判断是否是数字
int jud_num(char ch);
//判断预算符是否要入栈
int jud_ch(CHAR_STACK *s,char ch);
#endif
#ifndef __ERROR_H__
#define __ERROR_H__
#define ERROR -1
#define FULL -2
#define EMPTY -3
#define EMPTY_STACK -4
int errno ;
//向屏幕输出错误原因
void myerror (char *str);
//向字符串传送错误原因
char * myStrErroe (int num);
#endif
#ifndef __COUNTER_H__
#define __COUNTER_H__
#include"NumStack.h"
#include"CharStack.h"
void counter(NUM_STACK * n,CHAR_STACK * c);
#endif