您的位置:首页 > 理论基础 > 数据结构算法

数据结构6:使用栈计算逆波兰表达式

2014-04-08 21:36 537 查看
1、对于一个逆波兰表达式,需要判断出哪些是数字(整型、浮点型),同时判断出操作运算符,如何入栈呀?

====>搜的方法,没有说什么来区分数字还是操作符(所以我想问题就是个渣渣!),将所有的输入都作为字符输入!通过两个循环判断,外循环来判断整个字符串的结束;内循环利用空格来判断结束;

2、比较有意义的一点就是:比如,我原本是想输入整型12,计算机内存储是 49 50,通过一个字符数组a[0] = 49;a[1] = 50,然后再利用函数atof,将字符串转换成一个浮点型数据,再来处理!

3、但是如果是 3 -4 *,有负数该怎么处理呢?

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <ctype.h>
#define MAXSIZE 100
#define OK 1
#define ERROR 0
#define INCREACEMENT 10

typedef float ElemType;
typedef int Status;
typedef struct{
ElemType *base;
ElemType *top;
int Length;
}SqStack;

void InitStack(SqStack *S)
{
S->base = (ElemType *)malloc(MAXSIZE*sizeof(ElemType));
if (!S->base)
{
printf("Game Over");
exit(1);
}
S->top = S->base;
S->Length = MAXSIZE;//该参数应该是整个数组的长度,而不是数据元素的长度,因为长度可以S->top-S->base得出!
}

void Push(SqStack *S,ElemType e)
{
if (S->top - S->base >= S->Length)
{
S->base = (ElemType *)realloc(S->base,(INCREACEMENT+S->Length)*sizeof(ElemType));
if (!S->base)
{
printf("Game Over");
exit(1);
}
S->top = S->base +S->Length;
S->Length += INCREACEMENT;
}
*(S->top) = e;
S->top++;
}

Status Pop(SqStack *S,ElemType *e)
{
if (S->top == S->base)
{
printf("There is no element");
exit(1);
}
*e = *--(S->top);
return OK;
}

int main()
{
ElemType c,d;
float temp=0;
char e,str[MAXSIZE] = {0};
SqStack S;
int i = 0;
InitStack(&S);//忘了初始化了,尼妹!
printf("输入逆波兰表达式,数字与表达式中使用空格隔开:");
scanf("%c",&e);

while(e != '\n')
{
while(isdigit(e) || e == '.') //不明白为什么要判断是不是数字,我觉得没有意义啊
{
str[i] = e;
i++;
str[i] = '\0'; //注意最后一定要加上\0!
scanf("%c",&e);
if (e == ' ')
{
temp = atof(str);
Push(&S,temp);
i = 0;
break;
}
}
switch(e)
{
case '+':
Pop(&S,&c);
Pop(&S,&d);
Push(&S,c+d);
break;
case '-':
Pop(&S,&c);
Pop(&S,&d);
Push(&S,d-c);
break;
case '*':
Pop(&S,&c);
Pop(&S,&d);
Push(&S,c*d);
break;
case '/':
Pop(&S,&c);
Pop(&S,&d);
Push(&S,d/c);
break;
}
//将字符串转换为浮点型数据,并压入栈中
scanf("%C",&e);
}
printf("%f",*(--S.top));
system("pause");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: