资源简介
编译原理的中间代码生成阶段的逆波兰式和四元式算法实现,vc++6.0编写,
代码片段和文件信息
/* 改程序的作用是将一个表达式转换为逆波兰式;
* 程序的算法为老师上课讲的算法,在笔记本上有记载;
* 程序是基于栈的结构来实现的;
* 改程序的缺陷是不能够实现含有‘-‘号的表达式,而且不够完善,不能实现含有幂次运算。
*/
#include “stdio.h“
#include “stdlib.h“
#include “string.h“
#include “malloc.h“
#define maxsize 30
FILE *fp;
//定义的栈的结构
typedef struct node
{
char data[maxsize];
int top;
}seqstack;
//全局变量
seqstack *s1*s2;
char operater[4]={‘+‘‘-‘‘*‘‘/‘};
char operater1[2]={‘+‘‘-‘};
char operater2[2]={‘*‘‘/‘};
char Q[26]={‘a‘‘b‘‘c‘‘d‘‘e‘‘f‘‘g‘‘h‘‘i‘‘j‘‘k‘‘l‘‘m‘‘n‘‘o‘‘p‘‘q‘‘r‘‘s‘‘t‘‘u‘‘v‘‘w‘‘x‘‘y‘‘z‘};
//栈的操作
void setnull(seqstack *s) //置空栈
{
s->top=-1;
}
int empty(seqstack *s) //判断栈空
{
if(s->top==-1)
return 1; //空
else return 0; //非空
}
seqstack * push (seqstack *schar x) //进栈
{
if(s->top==maxsize-1)
{
printf(“overflow!\n“);
return NULL;
}
else
{
s->top++;
s->data[s->top]=x;
return s;
}
}
char pop (seqstack *s) //出栈
{
if(s->top<0)
{
printf(“underflow!\n“);
return NULL;
}
else
{
s->top--;
return s->data[s->top+1];
}
}
char top(seqstack *s) //取栈顶元素
{
if(s->top==-1)
{
printf(“stack is empty!\n“);
return NULL;
}
else
return (s->data[s->top]);
}
int isin(char a[]char bint N) //判断字符b是否为集合a中的元素
{
int i;
for (i=0;i {
if(b==a[i])
break;
}
if(i>=N)
return 0; //不是该集合中的元素
else
return 1; //是该集合中的元素
}
//列的转换
int turn1(char a)
{
if (isin(Qa26)==1)
return 0;
else if(a==‘(‘)
return 1;
else if(isin(operatera4)==1)
return 2;
else if(a==‘)‘)
return 3;
else if(a==‘#‘)
return 4;
else
return -1;
}
//行的转换
int turn2(char a)
{
if(a==‘$‘)
return 0;
else if(isin(operatera4)==1)
return 1;
else return -1;
}
//比较两个运算符的优先级
int compare(char achar b)
{
if (isin(operater1a2)==1 && isin(operater2b2)==1)
return 1; //a的优先级比b的优先级小
else return 0; //a的优先级大于或等于b的优先级
}
void main()
{
s1=(seqstack*)malloc(sizeof(seqstack));
s2=(seqstack*)malloc(sizeof(seqstack));
if((fp=fopen(“athwart-poland(逆波兰式).txt““w“))==NULL)
{
printf(“File open fail!\n“);
return;
}
char input[maxsize]chch2temp;
int i=0jsum=0com;
seqstack *s;
s=(seqstack *)malloc(sizeof(seqstack));
printf(“Please input the expression(esp: (a+b)*c):“);
fputs(“Please input the expression :“fp);
gets(input);
fputs(“input:“fp);
fputs(inputfp);
fputs(“\n“fp);
setnull(s);
setnull(s1);
setnull(s2);
i=0;sum=0;
s2=push(s2‘$‘);
s=push(s‘#‘);
while(input[i]!=‘\0‘)
{
sum++;
i++;
}
while(sum>0)
{
s=push(sinput[--sum]);
}
while(1)
{
ch=top(s);ch2=top(s2);
//printf(“ch=%cch2=%c\n“chch2);
i=turn2(ch2);j=turn1(ch);
//printf(“i=%dj=%d\n“ij);
if((i==0 && j==0) || (i==1 && j==0))
{
temp=pop(s);
s1=push(s1temp);
}
else if((i==0 && j==1) || (i==1 && j==1))
{
push(s2‘$‘);
s->top--;
}
else if(i==0 && j=
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 74 2010-08-11 13:36 四元式和逆波兰式\athwart-poland(逆波兰式).txt
文件 76 2010-08-11 13:30 四元式和逆波兰式\athwart-poland(逆波兰式)1.txt
文件 4132 2010-08-11 13:36 四元式和逆波兰式\athwart-poland.cpp
文件 3499 2010-08-11 13:33 四元式和逆波兰式\athwart-poland.dsp
文件 536 2010-08-11 13:37 四元式和逆波兰式\athwart-poland.dsw
文件 41984 2010-08-11 13:37 四元式和逆波兰式\athwart-poland.ncb
文件 48640 2010-08-11 13:37 四元式和逆波兰式\athwart-poland.opt
文件 1201 2010-08-11 13:37 四元式和逆波兰式\athwart-poland.plg
文件 4259 2010-08-11 13:37 四元式和逆波兰式\athwart-poland1.cpp
文件 3511 2010-08-11 13:37 四元式和逆波兰式\athwart-poland1.dsp
文件 538 2010-08-11 13:37 四元式和逆波兰式\athwart-poland1.dsw
文件 41984 2010-08-11 13:37 四元式和逆波兰式\athwart-poland1.ncb
文件 48640 2010-08-11 13:37 四元式和逆波兰式\athwart-poland1.opt
文件 1213 2010-08-11 13:37 四元式和逆波兰式\athwart-poland1.plg
文件 184385 2010-08-11 13:37 四元式和逆波兰式\Debug\athwart-poland.exe
文件 198712 2010-08-11 13:37 四元式和逆波兰式\Debug\athwart-poland.ilk
文件 13907 2010-08-11 13:37 四元式和逆波兰式\Debug\athwart-poland.obj
文件 228208 2010-08-11 11:23 四元式和逆波兰式\Debug\athwart-poland.pch
文件 459776 2010-08-11 13:37 四元式和逆波兰式\Debug\athwart-poland.pdb
文件 184386 2010-08-11 13:37 四元式和逆波兰式\Debug\athwart-poland1.exe
文件 198564 2010-08-11 13:37 四元式和逆波兰式\Debug\athwart-poland1.ilk
文件 14180 2010-08-11 13:37 四元式和逆波兰式\Debug\athwart-poland1.obj
文件 228208 2010-08-11 11:27 四元式和逆波兰式\Debug\athwart-poland1.pch
文件 459776 2010-08-11 13:37 四元式和逆波兰式\Debug\athwart-poland1.pdb
文件 188487 2010-08-11 13:38 四元式和逆波兰式\Debug\four-address(四元式).exe
文件 207884 2010-08-11 13:38 四元式和逆波兰式\Debug\four-address(四元式).ilk
文件 17295 2010-08-11 13:38 四元式和逆波兰式\Debug\four-address(四元式).obj
文件 228208 2010-08-11 11:19 四元式和逆波兰式\Debug\four-address(四元式).pch
文件 467968 2010-08-11 13:38 四元式和逆波兰式\Debug\four-address(四元式).pdb
文件 41984 2010-08-11 13:38 四元式和逆波兰式\Debug\vc60.idb
............此处省略15个文件信息
- 上一篇:MUSIC算法c 实现
- 下一篇:水处理程序
相关资源
- unity3d反编译工具
- 汇编语言编译器masm5.0
- 《编译原理》清华大学版中的pl0扩充
- PL/0功能扩充break功能
- 编译词法分析器识别关键字常数和符
- uCOS编译环境建立 BC45 TASM
- zlib 最新 1.2.8 win32 win64 编译好的dll
- 编译原理LR(0)语法分析
- 编译原理中间代码生成程序
- 编译原理:LR分析程序
- C编译器源代码(超级牛b).rar
- Delphi反编译工具的源码
- 小程序反编译文件wxappUnpacker.rar
- win10 64位下编译的opencv4.5.5库,opencv
- 易语言模块反编译助手
- librdkafka win7 64位 vs2015编译Release版本
- 编译原理实验:词法分析,语法分析
- 吉林大学编译原理课件
- delphi 反编译工具 源码
- 编译好的json_lib.lib 包含64位,32位,头
- frcc.exe fastreport编译中文没乱码
- 编译原理龙书答案
- 编译原理 第三章课后习题答案
- 易语言变量和数组的编译原理
- Win10安装MTK编译环境说明及补丁
- dwsurvey编译好的war包
- 编译原理语法分析器、词法分析器
- ffserver(windows下编译32位)
- 山东大学编译原理PL/0语言 compiler实验
- PB反编译大师V2012.12.10
评论
共有 条评论