#include <iostream>
using namespace std;
#define MAXBUFFER 100
#define STACK_INIT_SIZE 20
#define STACKINCREMENT 10
typedef double ElemType;
struct sqStack
{
ElemType *base;
ElemType *top;
int stackSize;
};
void StackInit(sqStack *s)
{
s->base=(ElemType *)malloc(sizeof(ElemType)*STACK_INIT_SIZE);
if(!s->base)
{
exit(0);
}
s->top=s->base;
s->stackSize=STACK_INIT_SIZE;
}
void Push(sqStack *s,ElemType e)
{
if(s->stackSize==s->top-s->base)
{
s->base=(ElemType *)realloc(s->base,sizeof(ElemType)*(s->stackSize+STACKINCREMENT));
if(!s->base)
{
exit(0);
}
}
*s->top=e;
s->top++;
}
void Pop(sqStack *s,ElemType *e)
{
if(s->top==s->base)
{
cout<<"空栈!"<<endl;
}
s->top--;
*e=*s->top;
}
void StackShow(sqStack s)
{
ElemType *p;
p=s.base;
cout<<"栈内现在有的数据是这些:";
while(p!=s.top)
{
cout<<*p<<"\t";
p++;
}
cout<<endl;
p=NULL;
}
ElemType GetTop(sqStack s)
{
ElemType *c;
c=s.top;
c--;
return *c;
}
------------------------------------------------------------------------------------------------------------------------------------------
#include <iostream>
#include"MemberFunction.h"
#include <ctype.h>
#include <stdlib.h>
using namespace std;
int main()
{
char str[MAXBUFFER],c,fstr[MAXBUFFER];
sqStack s;
int i=0,j=0;
char *p;
ElemType a,b;
StackInit(&s);
cout<<"输入中缀表达式(数学表达式),以‘=’结束:"<<endl;
cin.get(c);
while(c!=EOF&&c!='=')
{
str[i++]=c;
cin.get(c);
if(i>=MAXBUFFER)
{
cout<<"单次输入的算式过长,请化简!";
i=0;
fflush(stdin);
cout<<"重新输入:";
cin.get(c);
}
}
str[i++]='=';
str[i]='\0';
cout<<"转换后的逆波兰表达式为:\n";
p=str;
while(*p!='\0')
{
while(isdigit(*p)||*p=='.')
{
fstr[j++]=*p++;
fstr[j]='\0';
if(!(isdigit(*p)||*p=='.'))
{
a=atof(fstr);
cout<<a<<' ';
j=0;
break;
}
}
switch(*p)
{
case '+':
{
while(s.top!=s.base)
{
Pop(&s,&b);
if(b=='(')
{
Push(&s,b);
break;
}
else
{
putchar(b);
cout<<' ';
}
}
Push(&s,*p++);
break;
}
case '-':
{
while(s.top!=s.base)
{
Pop(&s,&b);
if(b=='(')
{
Push(&s,b);
break;
}
else
{
putchar(b);
cout<<' ';
}
}
Push(&s,*p++);
break;
}
case '*':
{
Push(&s,*p++);
break;
}
case '/':
{
Push(&s,*p++);
break;
}
case '=':
{
while(s.top!=s.base)
{
Pop(&s,&b);
if(b=='(')
{
continue;
}
putchar(b);
cout<<' ';
}
cout<<'='<<endl;
p++;
break;
}
case '(':
{
Push(&s,*p++);
break;
}
case ')':
{
while(s.top!=s.base)
{
Pop(&s,&b);
if(b=='(')
{
break;
}
putchar(b);
cout<<' ';
}
p++;
break;
}
default:
{
return -1;
}
}
}
return 0;
}