📄 siyuanshi.cpp
字号:
/*
表达式生成四元式
算符优先方法
*/
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <iostream.h>
#include <stdlib.h>
#define STACK_INIT_SIZE 50
#define STACKINCREMENT 5
#define ERROR 0
#define OVERFLOW -2
#define TRUE 1
#define FALSE 0
#define OK 1
#define NULL 0
void GEQ();
void PRINT();
int check(char S,char C);
int change(char m);
typedef struct Stack
{
char *base;
char *top;
int stacksize;
}Stack;
int relation[8][8]={ {2,2,-2,-2,-2,-2,2,2},
{2,2,-2,-2,-2,-2,2,2},
{2,2,2,2,-2,-2,2,2},
{2,2,2,2,-2,-2,2,2},
{2,2,2,2,-1,-1,2,2},
{-2,-2,-2,-2,-2,-2,0,2},
{2,2,2,2,-1,-1,2,2},
{-2,-2,-2,-2,-2,-2,-2,1}
};
// <@-2 error@-1 =@0 >@2 OK@1
int num=0;
char QT[10][4],T='A',c;
struct Stack SEM,SYN;
struct InitStack(Stack s)
{
s.base=(char *)malloc(STACK_INIT_SIZE*sizeof(char));
if(!s.base)
exit(OVERFLOW);
s.top=s.base;
s.stacksize=STACK_INIT_SIZE;
return OK;
}
//初始化堆栈
char GetTop(Stack &s)
{
char e;
if(s.top==s.base)
return ERROR;
e=*(s.top-1);
return e;
}
//取栈顶元素
char Pop(Stack &s)
{
char e;
if(s.top==s.base)
{printf("栈中已无元素!");
exit(ERROR);
}
e=*--s.top;
return e;
}
//出栈
struct Push(Stack &s,char e)
{
if(s.top-s.base>=s.stacksize)
{
s.base=(char *)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(char));
if(!s.base)
exit(OVERFLOW);
s.top=s.base+s.stacksize;
s.stacksize+=STACKINCREMENT;
}
*s.top++=e;
return OK;
}
//入栈
void main()
{
int G;
InitStack(SEM);
InitStack(SYN);
printf("----表达式应由小写字母、运算符及小括号组成,并以\"#\"结束----\n");
printf("请输入表达式:");
Push(SYN,'#');
c=getchar();
while((G=check(GetTop(SYN),c))!=-1&&G!=1)
{
if(G==-2)
Push(SYN,c);
else if(G==2)
{
if(GetTop(SYN)<='z'&&GetTop(SYN)>='a')
{
Push(SEM,Pop(SYN));
continue;
}
else
{
GEQ();
continue;
}
}
else
Pop(SYN);// =
c=getchar();
}
if(G==-1)
printf("您的输入有误!");
else
PRINT();
getchar();
}
int check(char S,char C)
{
return relation[change(S)][change(C)];
}
int change(char m)
{
switch(m)
{
case '+': return 0;
case '-': return 1;
case '*': return 2;
case '/': return 3;
case '(': return 5;
case ')': return 6;
case '#': return 7;
default: return 4;
}
}
void GEQ()
{
QT[num][0]=Pop(SYN);
QT[num][2]=Pop(SEM);
QT[num][1]=Pop(SEM);
QT[num][3]=T;
Push(SEM,T);
num++;
T++;
}
void PRINT()
{
printf("您输入的表达式所对应的四元式为:\n");
for(int i=0;i<num;i++)
{
printf("(");
printf("%c",QT[i][0]);
if(QT[i][1]<='Z'&&QT[i][1]>='A')
printf("\t%c%d",'t',QT[i][1]-'A'+1);
else
printf("\t%c",QT[i][1]);
if(QT[i][2]<='Z'&&QT[i][1]>='A')
printf("\t%c%d",'t',QT[i][2]-'A'+1);
else
printf("\t%c",QT[i][2]);
if(QT[i][3]<='Z'&&QT[i][1]>='A')
printf("\t%c%d",'t',QT[i][3]-'A'+1);
else
printf("\t%c",QT[i][3]);
printf(")\n");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -