📄 lgh2.5.c
字号:
#include <stdio.h>
#include <math.h>
#include<stdlib.h>
#include<malloc.h>
#define MAXNUM 100
char c,op;
int a,b;
int k=0;
int Q;
struct SeqStack {
int t;
char s[MAXNUM];/*存储符号的数组区域*/
int d[MAXNUM]; /*存储数字的数组区域*/
};
typedef struct SeqStack *PSeqStack;
PSeqStack OPTR,OPND;
PSeqStack initstack( void )/*创建空栈*/
{
PSeqStack pastack = (PSeqStack)malloc(sizeof(struct SeqStack));
if(pastack==NULL)
printf("Out of space!! \n");
else
pastack->t = -1;
return pastack;
}
int isEmptyStack( PSeqStack pastack )/*判断空栈是否*/
{
return pastack->t == -1;
}
void push_char( PSeqStack pastack, char x ) /*字符进栈操作*/
{
if( pastack->t >= MAXNUM - 1 )
printf( "Stack Overflow! \n" );
else
{
pastack->t++;
pastack->s[pastack->t] = x;
}
}
void push_int( PSeqStack pastack, int x ) /*数字进栈操作*/
{
if( pastack->t >= MAXNUM - 1 )
printf( "Stack Overflow! \n" );
else
{
pastack->t++;
pastack->d[pastack->t] = x;
}
}
void pop( PSeqStack pastack )/*抛栈*/
{
if (pastack->t == -1 )
printf( "Underflow!\n" );
else
pastack->t--;
}
char gettop_char( PSeqStack pastack )/*获得栈顶字符*/
{
return pastack->s[pastack->t];
}
int gettop_int( PSeqStack pastack )/*获得栈顶字符*/
{
return pastack->d[pastack->t];
}
char precede(char x,char y)/*运算符优先级别设置*/
{
if(x=='+')
{
switch(y)
{
case '+': return('>');
case '-': return('>');
case '*': return('<');
case '/': return('<');
case '(': return('<');
case ')': return('>');
case '=': return('>');
}
}
if(x=='-')
{
switch(y)
{
case '+': return('>');
case '-': return('>');
case '*': return('<');
case '/': return('<');
case '(': return('<');
case ')': return('>');
case '=': return('>');
}
}
if(x=='*')
{
switch(y)
{
case '+': return('>');
case '-': return('>');
case '*': return('>');
case '/': return('>');
case '(': return('<');
case ')': return('>');
case '=': return('>');
}
}
if(x=='/')
{
switch(y)
{
case '+': return('>');
case '-': return('>');
case '*': return('>');
case '/': return('>');
case '(': return('<');
case ')': return('>');
case '=': return('>');
}
}
if(x=='(')
{
switch(y)
{
case '+': return('<');
case '-': return('<');
case '*': return('<');
case '/': return('<');
case '(': return('<');
case ')': return('=');
case '=': return(0);
}
}
if(x==')')
{
switch(y)
{
case '+': return('>');
case '-': return('>');
case '*': return('>');
case '/': return('>');
case '(': return(0);
case ')': return('>');
case '=': return('>');
}
}
if(x=='=')
{
switch(y)
{
case '+': return('<');
case '-': return('<');
case '*': return('<');
case '/': return('<');
case '(': return('<');
case ')': return(0);
case '=': return('=');
}
}
return NULL;
}
void Operate(int m,char o,int n)
{
switch(o)
{
case '+': push_int(OPND,m+n);break; /*操作结果运算后进入数字栈*/
case '-': push_int(OPND,m-n);break; /*操作结果运算后进入数字栈*/
case '*': push_int(OPND,m*n);break; /*操作结果运算后进入数字栈*/
case '/': push_int(OPND,m/n);break; /*操作结果运算后进入数字栈*/
}
}
void printOPTR(PSeqStack pastack)
{ int q;
if(pastack->t==-1)return;
else
{
for(q=0;q<=pastack->t;q++)
printf(" %c",pastack->s[q]);
}
}
void printOPND(PSeqStack pastack)
{ int q;
if(pastack->t==-1)return;
else
{
for(q=0;q<=pastack->t;q++)
printf(" %d",pastack->d[q]);
}
}
void printop(int Q)
{
switch(Q)
{
case 1 : printf("push(OPTR,'%c')",c);break;
case 2 : printf("pop(OPTR)");break;
case 3 : printf("Operate('%d','%c','%d')",b,op,a);break;
case 4 : printf("push(OPND,'%d')",k);break;
}
}
void main()
{
int z=1,r=0;
int arr[100];
int i=0,j=0;char t;
loop:
OPTR=initstack();
OPND=initstack();
system("cls");printf("\n");
printf(" 班别:04级计算机4班 学生:刘国辉 学号:3104006598\n\n");
printf("########################欢迎使用算术表达式求值演示系统!######################\n");
printf("\n请输入求值表达式并以“=”结束: (运算以输入表达式正确为前提)\n\n");
push_char(OPTR,'='); /*栈底元素,最后与输入的等号配对结束*/
c=getchar();
while(c!='='||gettop_char(OPTR)!='=')
{
if(c=='+'||c=='-'||c=='*'||c=='/'||c=='('||c==')'||c=='=')
{
if(r==0)
{
printf("\n---------------------------------------------------------\n");
printf("\nstep: OPTR栈: OPND栈: 主要操作:\n\n");r=1;
}
if(j!=0) /*为将输入的连续数字看做一个整体数*/
{
for(i=0;i<=j;i++)
k=k+arr[i]*(int)pow(10,j-i-1); /*pow(x,y)为求x的y次冥*/
push_int(OPND,k);Q=4;
printf("%d",z);z++;printf("\t");
printOPTR(OPTR);printf("\t\t\t");printOPND(OPND);printf("\t\t\t");printop(Q);printf("\n");
i=0;j=0,k=0;
}
switch(precede(gettop_char(OPTR),c))
{
case '<':
push_char(OPTR,c); Q=1; /*当前操作符优先级 低于栈顶 则 进符号栈*/
printf("%d",z);z++;printf("\t");
printOPTR(OPTR);printf("\t\t\t");printOPND(OPND);printf("\t\t\t");printop(Q);printf("\n");
c=getchar(); /*接收下一字符*/
break;
case '=':
pop(OPTR);Q=2;
printf("%d",z);z++;printf("\t");
printOPTR(OPTR);printf("\t\t\t");printOPND(OPND);printf("\t\t\t");printop(Q);printf("\n");
c=getchar(); /*接收下一字符*/
break;
case '>':/*当前操作符优先级 高于栈顶 则从符号栈取一元素,从数字栈取两个元素进行运算*/
op=gettop_char(OPTR);
pop(OPTR);
a=gettop_int(OPND);
pop(OPND);
b=gettop_int(OPND);
pop(OPND);
Operate(b,op,a);Q=3;
printf("%d",z);z++;printf("\t");
printOPTR(OPTR);printf("\t\t\t");printOPND(OPND);printf("\t\t\t");printop(Q);printf("\n");
break;
}
}
else /*当输入的是其他字符的时候,则转化为整型*/
{
arr[j]=c-48;
j++;
c=getchar();/*接收下一字符*/
}
}
if(j!=0)/* 当输入只有一个操作数时处理 */
{
printf("\n---------------------------------------------------------\n");
printf("\nstep: OPTR栈: OPND栈: 主要操作:\n\n");
for(i=0;i<=j;i++)
k=k+arr[i]*(int)pow(10,j-i-1); /*pow(x,y)为求x的y次冥*/
push_int(OPND,k);z=1;
printf("%d",z);printf("\t");
printOPTR(OPTR);printf("\t\t\t");printOPND(OPND);printf("\t\t\t");
printf("push(OPND,'%d')",gettop_int(OPND));
printf("\n");
}
printf("------------------------------------------------------------------\n");
printf("\n运算结果== %d",gettop_int(OPND));
getchar();
printf("\n\n\n按下回车键继续,按下“q”退出系统!\n");
scanf("%c",&t);
if(t=='q')return;
else
r=0;z=1; goto loop;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -