📄 ll(1).cpp
字号:
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define MaxSize 100
char E[]="TG";
char G1[]="+TG";
char G2[]="-TG";
char G3[]="e";
char T[]="FS";
char S1[]="*FS";
char S2[]="/FS";
char S3[]="e";
char F1[]="(E)";
char F2[]="i";
char input[10];
int j=0,temp;
typedef struct
{
char stack[MaxSize];
int top;
}stacktype;
void initstack(stacktype *S)
{
S->stack[0]='#';
S->stack[1]='E';
S->top=1;
}
void reversepush(stacktype *S,char x[])
{
int n;
n=strlen(x);
if (S->top==MaxSize)
printf("栈上溢出!\n");
else
for(n=n-1;n>=0;n--) //产生式反向入栈
{
S->top++;
S->stack[S->top]=x[n];
}
}
void pop(stacktype *S)
{
if (S->top==-1)
printf("栈下溢出!\n");
else
S->top--;
}
char re_top_value(stacktype *S)
{
return(S->stack[S->top]);
}
void display(stacktype *S)
{
int i;
for (i=0;i<=S->top;i++)
printf("%c",S->stack[i]);
printf("\t");
}
void print(int pos)
{
temp=pos;
for(pos;pos<=10;pos++)
printf("%c",input[pos]);
printf("\n");
pos=temp;
}
main()
{
int i=0,flag=0;
char a;
stacktype st;
printf("初始化符号栈...\n");
initstack(&st);
printf("OK!\n");
printf("请输入符号串(10个以内),以“#”结束!\n");
do
{
scanf("%c",&input[i]);
i++;
}while(input[i-1]!='#');
printf("符号栈\t剩余字符串\n");
display(&st);
print(j);
while(1)
{
if(((a=re_top_value(&st))=='#')&&input[j]=='#')
{
printf("结束!\n");
if(flag==0)
printf("表达式正确!");
else
printf("表达式有错误!错误原因:缺少变量!\n");
exit(0);
}
if((input[j]==(a=re_top_value(&st)))&&input[j]!='#')
{
pop(&st);
j++;
display(&st);
print(j);
}
if(input[j]!=(a=re_top_value(&st)))
{
if(a=='E'&&(input[j]=='('||input[j]=='i'))
{
pop(&st);
reversepush(&st,E);
display(&st);
print(j);
}
if(a=='E'&&(input[j]=='#'))
{
pop(&st);
display(&st);
print(j);
}
if(a=='T'&&(input[j]=='('||input[j]=='i'))
{
pop(&st);
reversepush(&st,T);
display(&st);
print(j);
}
if(a=='T'&&(input[j]==')'||input[j]=='+'||input[j]=='-'||input[j]=='#'))
{
pop(&st);
display(&st);
printf("本处有错误!\n");
flag=1;
print(j);
}
if(a=='G'&&input[j]=='+')
{
pop(&st);
reversepush(&st,G1);
display(&st);
print(j);
}
if(a=='G'&&input[j]=='-')
{
pop(&st);
reversepush(&st,G2);
display(&st);
print(j);
}
if(a=='G'&&(input[j]=='#'||input[j]==')'))
{
pop(&st);
display(&st);
print(j);
}
if(a=='F'&&input[j]=='(')
{
pop(&st);
reversepush(&st,F1);
display(&st);
print(j);
}
if(a=='F'&&input[j]=='i')
{
pop(&st);
reversepush(&st,F2);
display(&st);
print(j);
}
if(a=='F'&&(input[j]==')'||input[j]=='+'||input[j]=='-'||input[j]=='*'||input[j]=='/'||input[j]=='#'))
{
pop(&st);
display(&st);
printf("本处有错误!\n");
flag=1;
print(j);
}
if(a=='S'&&input[j]=='*')
{
pop(&st);
reversepush(&st,S1);
display(&st);
print(j);
}
if(a=='S'&&input[j]=='/')
{
pop(&st);
reversepush(&st,S2);
display(&st);
print(j);
}
if(a=='S'&&(input[j]=='#'||input[j]==')'||input[j]=='+'||input[j]=='-'))
{
pop(&st);
display(&st);
print(j);
}
if((a=='('||a==')')&&input[j]!=a)
{
printf("表达式错误!错误原因:括号不匹配!分析中断!\n");
if(flag==1)
printf("缺少变量!\n");
exit(0);
}
if(a=='E'&&(input[j]==')'||input[j]=='+'||input[j]=='-'||input[j]=='*'||input[j]=='/'))
{
printf("表达式错误,分析中断!\n");
exit(0);
}
if(a=='T'&&(input[j]=='*'||input[j]=='/'))
{
printf("表达式错误,分析中断!\n");
exit(0);
}
if(a=='G'&&(input[j]=='i'||input[j]=='('||input[j]=='*'||input[j]=='/'))
{
printf("表达式错误,分析中断!\n");
exit(0);
}
if(a=='S'&&(input[j]=='i'||input[j]=='('))
{
printf("表达式错误,分析中断!\n");
exit(0);
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -