⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lgh2.5.c

📁 算术表达式求值演示系统--数据结构作业!
💻 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 + -