資源簡介
編譯原理的中間代碼生成階段的逆波蘭式和四元式算法實現,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 實現
- 下一篇:水處理程序
評論
共有 條評論