|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
#include<iostream>
#include<math.h>
#include<ctype.h>
using namespace std;
#define STACK_INIT_SIZE 20
#define STACKINCREMENT 10
#define MAXBUFFER 10
//逆波兰的计算器
//栈的顺序存储结构
typedef double ElemType;
typedef struct
{
ElemType *base; //栈底
ElemType *top; //用指针表示,指示栈的最顶层,没放元素
int stackSize;
}SqStack;
//初始化一个栈
void InitStack(SqStack *s)
{
s->base=(ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType));
if(!s->base)
exit(0);
s->top=s->base;
s->stackSize=STACK_INIT_SIZE;
}
//插入一个元素
void Push(SqStack *s,ElemType e)
{
if(s->top-s->base>=s->stackSize)
{
s->base=(ElemType *)realloc(s->base,(s->stackSize+STACK_INIT_SIZE)*sizeof(ElemType));
if(!s->base)
exit(0);
}
*(s->top)=e;
s->top++;
}
//删除一个元素
void Pop(SqStack *s,ElemType *e)
{
if(s->top==s->base)
return;
*e=*--(s->top);
}
//清空一个栈,将栈中的元素全部作废,但栈本身的物理空间并不发生改变
void ClearStack(SqStack *s)
{
s->top=s->base;
}
//销毁一个栈,是要释放掉该栈所占据的物理内存空间
void DestoryStack(SqStack *s)
{
int len;
len=s->stackSize;
for(int i=0;i<len;i++)
{
free(s->base);
s->base++;
}
s->base=s->top=NULL;
s->stackSize=0;
}
//计算栈的当前容量,栈的最大容量是指该栈占据内存空间的大小其值是s.stackSize,与当前容量摸不同
int StackLen(SqStack s)
{
return(s.top-s.base); //指针之间不能相加,但可以相减
}
int main()
{
SqStack s;
char c;
double d,e;
char str[MAXBUFFER];
int i=0;
InitStack(&s);
cout<<"请按逆波兰表达式输入待计算数据,数据与运算法之间用空格隔开,以#作为结束标志!"<<endl;
cin>>c;
while(c!='#')
{
while(isdigit(c) || c=='.') //用于过滤数字
{
str[i++]=c;
str='\0';
if(i>=10)
{
cout<<"输入的单个数据过大!"<<endl;
return -1;
}
cin>>c;
if(c==' ')
{
d=atof(str); //将字符串转化为浮点数
Push(&s,d);
i=0;
break;
}
}
switch(c)
{
case '+':
Pop(&s,&d);
Pop(&s,&e);
Push(&s,e+d);
break;
case '-':
Pop(&s,&d);
cout<<d<<endl;
Pop(&s,&e);
cout<<e<<endl;
cout<<d-e<<endl;
Push(&s,e-d);
break;
case '*':
Pop(&s,&d);
Pop(&s,&e);
Push(&s,e*d);
break;
case '/':
Pop(&s,&d);
Pop(&s,&e);
if(d!=0)
Push(&s,e/d);
else
cout<<"出错,除数为0!"<<endl;
break;
}
cin>>c;
}
Pop(&s,&d);
cout<<"最后的结果为:"<<d<<endl;
return 0;
}
哪儿有错啊 ?为啥送不到栈内呢?
|
|