逆波兰表达式-中缀转后缀(计算器)

2018-01-25 10:56:28来源:网络收集作者:纳米程序员人点击

分享
第七城市

[var1]#include
#include
#include
#define OK 1
#define ERROR 0
#define STACK_INIT_SIZE 10
#define STACKINCREMENT 5
#define MAXBUFFERSIZE 15
typedef double ElemType;
typedef int STATUS;
typedef struct Stack {
ElemType * top;
ElemType *base;
int stackSize;
}stack;
STATUS initStack(stack * s)
{
s->base = (ElemType*)malloc(STACK_INIT_SIZE * sizeof(ElemType));
s->top = s->base;
s->stackSize = STACK_INIT_SIZE;
return OK;
}
STATUS Push(stack *s, ElemType e)
{
if (s->top - s->base >= s->stackSize)
{
s->base = (ElemType*)realloc(s->base, (s->stackSize + STACKINCREMENT) * sizeof(ElemType));
if (!s->base)return ERROR;
s->top = s->base + s->stackSize;
s->stackSize = s->stackSize + STACKINCREMENT;
}
*(s->top) = e;
s->top++;
return OK;
}
STATUS Pop(stack *s, ElemType * e)
{
if (s->base == s->top)return ERROR;
--s->top;
*e = *(s->top);
return OK;
}
STATUS clearStack(stack *s)
{
s->top = s->base;
return OK;
}
STATUS destoryStack(stack *s)
{
//for (int i = 0; i < s->stackSize; i++)
//{
free(s->base);
//s->base++;
//}
//printf("%d", *(s->base));
s->base = 0;
s->top = 0;
s->stackSize = 0;
return OK;
}
int main(int argc, char * argv[])
{
stack s;
initStack(&s);//初始化栈
char c;
double a,b,d;
char str[MAXBUFFERSIZE];//字符缓冲区
int j = 0;//缓冲区指针
printf("请输入:要计算的逆波兰表达式,#结束,操作符和数字之间空格隔开:/n");
/***************************************************
*这里需要注意一个问题
* scanf("%c",&c) 一次读入一个字符
*如果一次输入一个字符串的话,读入一个字符后,其余字符全部放在字符缓冲区,
*留给下一次 scanf,
*(输入的 回车 /n也是有ASCII码的,最好用getchar()清空缓冲区)
**************************************************/
scanf("%c", &c);
while (c != '#')
{
//数字和数字之间的空格处理
while (isdigit(c) || c == '.') //输入的是数字或者是小数点的情况(isdigit内部是根据查ASCII看字符是否是数字)
{
str[j++] = c;
if (j >= MAXBUFFERSIZE)
{
printf("您输入的单个数字太长/n");
return 1;
}
scanf("%c", &c);//读取输入缓冲区字符
if (c == ' ') //如果是空格,就表示一个数字输入完成了(实际是字符串,存在缓冲区)空格的ASCII码是32
{
str[j] = '/0';//结束符(用于atof内部)
d=atof(str);//字符串转double(缓冲区内的所有字符,就是一个数字)
Push(&s, d);
j = 0;//恢复缓冲区指针,用于下一次使用
break;//退出循环这一层循环
}
}
switch (c)
{
case '+':
Pop(&s, &a);
Pop(&s, &b);
Push(&s, a + b);
break;
case '-':
Pop(&s, &a);
Pop(&s, &b);
Push(&s, b - a);
break;
case '*':
Pop(&s, &a);
Pop(&s, &b);
Push(&s, a*b);
break;
case '/':
Pop(&s, &a);
Pop(&s, &b);
Push(&s, b / a);
break;
}
scanf("%c", &c);
}
getchar();//getchar 可以用来清空缓冲区
Pop(&s, &d);
printf("运算结果是%f", d);
system("pause");
return 0;
}
第七城市

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台