鱼C论坛

 找回密码
 立即注册

中缀表达式转换为后缀表达式

已有 192 次阅读2014-2-14 16:29 |个人分类:数据结构和算法

#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;
}

路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 立即注册

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-13 09:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

返回顶部