數據結構運算符作業

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define NULL 0
#define OK 1
#define ERROR -1
#define STACK_SIZE 100
#define STACKsize 20
/*定義字符類型棧*/
typedef struct{
 int stacksize;
 char *base;
 char *top;

}Stack;
/*定義整數棧*/
typedef struct{
 int stacksize;
 int *base;
 int *top;
}Stack2;
/*-----全局變量-----*/
Stack OPTR;   //定義運算符棧
Stack2 OPND;   //定義操作數棧
char expr[255]="";//存放表達式串
char *ptr=expr;


int InitStack(Stack *s)//構造運算符棧
{
 s->base=(char *)malloc(STACK_SIZE*sizeof(char));
 if(!s->base)return ERROR;
 s->top=s->base;
 s->stacksize=STACKsize;
 return OK;
}
int InitStack2(Stack2 *s)//構造操作數棧
{
 s->base=(int *)malloc(STACKsize*sizeof(int));
 if(!s->base)return ERROR;
 s->stacksize=STACKsize;
 s->top=s->base;
 return OK;
}
int In(char ch) //判斷字符是否是運算符,運算符返回1
{
 return(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch==')'||ch=='#');
}
int Push(Stack *s,char ch)//運算符棧插入ch爲新的棧頂元素
{
 *s->top=ch;
 s->top++;
 return 0;
}
int Push2(Stack2 *s,int ch)//操作數棧插入新的棧頂元素
{
 *s->top=ch;
 s->top++;
 return 0;
}
char Pop(Stack *s)//刪除運算符棧s的棧頂元素,用p返回其值
{
 char p;
 s->top--;
 p=*s->top;
 return p;
}
int Pop2(Stack2 *s)//刪除操作數棧s的棧頂元素,用p返回其值
{
 int p;
 s->top--;
 p=*s->top;
 return p;
}
char GetTop(Stack s)//用p返回運算符棧s的棧頂元素
{
 char p=*(s.top-1);
 return p;
}
int GetTop2(Stack2 s)//用p返回操作符棧s的棧頂元素
{
 int p=*(s.top-1);
 return p;
}
/*判斷運算符優先權,返回優先權高的*/
char Precede(char c1,char c2)
{
 int i=0,j=0;
 static char array[49]={
  '>','>','<','<','<','>','>',
  '>','>','<','<','<','>','>',
  '>','>','>','>','<','>','>',
  '>','>','>','>','<','>','>',
  '<','<','<','<','<','=','!',
  '>','>','>','>','!','>','>',
  '<','<','<','<','<','!','='
 };
 switch(c1)
 {
  case'+':i=0;break;
  case'-':i=1;break;
  case'*':i=2;break;
  case'/':i=3;break;
  case'(':i=4;break;
  case')':i=5;break;
  case'#':i=6;break;
 }
 switch(c2)
 {
  case'+':j=0;break;
  case'-':j=1;break;
  case'*':j=2;break;
  case'/':j=3;break;
  case'(':j=4;break;
  case')':j=5;break;
  case'#':j=6;break;

 }
 return(array[7*i+j]);//返回運算符
}
int Operate(int a,char op,int b)
{
 switch(op)
 {
 case'+':return(a+b);
 case'-':return(a-b);
 case'*':return(a*b);
 case'/':return(a/b);
 }
 return 0;
}
int num(int n)//返回操作數的長度
{
 char p[10];
 itoa(n,p,10);//把整型轉換成字符串型
 n=strlen(p);
 return n;
}
int EvalExpr()//主要操作函數
{
 char c,theta,x;
 int n,m;
 int a,b;
 c=*ptr++;
 while(c!='#'||GetTop(OPTR)!='#')
 {
  if(!In(c))
  {
   if(!In(*(ptr-1)))
    ptr=ptr-1;
   m=atoi(ptr);//取字符前面的數字段
   n=num(m);
   Push2(&OPND,m);
   ptr=ptr+n;
   c=*ptr++;
  }
  else
  {
   switch(Precede(GetTop(OPTR),c))
   {
    case'<':
     Push(&OPTR,c);
     c=*ptr++;
     break;
    case'=':
     x=Pop(&OPTR);
     c=*ptr++;
     break;
    case'>':
     theta=Pop(&OPTR);
     b=Pop2(&OPND);
     a=Pop2(&OPND);
     Push2(&OPND,Operate(a,theta,b));
     break;
   }

  }
  
 }
 return GetTop2(OPND);
 
}
int main()
{
 printf("輸出以#爲結尾的正確表達式:");
 do
 {
  gets(expr);
 }while(!*expr);
 InitStack(&OPTR);//初始化運算符棧
 Push(&OPTR,'#');//將#壓入運算符棧
 InitStack2(&OPND);//初始化操作數棧
 printf("表達式結果爲:%d\n",EvalExpr());
 system("pause");
 return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章