資料結構:棧的應用(中綴表示式)
阿新 • • 發佈:2021-02-16
一、要求:
輸入一個表示式,表示式中只包含整數和加、減、乘、除四種雙目運算子,計算給定表示式的值(參考中綴表示式求值)
二、程式碼:
#include<stdio.h>
#include<stdlib.h.>
#include<string.h>
#define StackInitSize 100
#define StackIncrement 10
typedef struct{
char *base;
int top;
int stacksize;
}SqStack;
//******初始化********//
void InitStack(SqStack &S){
S.base = (char*)malloc(StackInitSize*sizeof(char));
if(!S.base)
return ;
S.top = 0; //棧頂指標初值為0
S.stacksize = StackInitSize; //空間大小初始值
}
//********判空**********//
int StackEmpty(SqStack S){
if(S.top==0)
return 1;
return 0;
}
//********入棧 ********//
void Push(SqStack & S,char e){
if(S.top>=S.stacksize){
S.base = (char*)realloc(S.base,(S.stacksize+StackIncrement)*sizeof(char));
if(!S.base)
return ;
S.stacksize += StackIncrement;
}
S.base[S.top++] = e;
}
//*********操作數出棧********//
void Pop_OPND(SqStack &S,int &e){
if(S.top==0)
return ;
e = S.base[ --S.top];
}
//*********算符出棧********//
void Pop_OPTR(SqStack &S,char &e){
if(S.top==0)
return ;
e = S.base[--S.top];
}
//********獲取棧頂元素*******//
char GetTop(SqStack S){
if(S.top==0)
return 0;
return S.base[S.top-1];
}
//*****定位theta在算符集合中的位置*******//
int Locate(char *s,char theta){
int i;
i = 0;
while(i<int(strlen(s))){
if(s[i]==theta)
return i;
else
i+=1;
}
if(i==int(strlen(s))){
printf("輸入的算符theta有錯誤!");
return NULL;
}
}
//********獲取兩個算符的優先關係********//
char Compare(char theta1,char theta2){
int i,j;
char Prior[7][7] = {{'>','>','<','<','<','>','>'},
{'>','>','<','<','<','>','>'},
{'>','>','>','>','<','>','>'},
{'>','>','>','>','<','>','>'},
{'<','<','<','<','<','=',' '},
{'>','>','>','>',' ','>','='},
{'<','<','<','<','<',' ','>'}};
char OP[7] = {'+','-','*','/','(',')','#'};
i=Locate(OP,theta1);
j=Locate(OP,theta2);
return Prior[i][j];
}
//*****執行a theta b運算*********//
int Operate(int a,char theta,int b){
switch(theta){
case'+': return a+b;
case'-': return a-b;
case'*': return a*b;
case'/': return a/b;
}
}
//*****計算給定表示式的值*******//
int EvaluateExpression(SqStack OPTR,SqStack OPND,char *str){
char *p,ch,theta;
int num,a,b;
p = str;
Push(OPTR,*p);
p++;
while(*p!='#'||GetTop(OPTR)!='#'){
if(*p>='0' && *p<='9'){
num = 0;
while(*p!='#' && *p>='0' &&*p<='9'){
num = num * 10 + *p - '0';
p++;
}
Push(OPND,num);
}
else
switch(Compare(GetTop(OPTR),*p)){
case'<': Push(OPTR,*p); p++;
break;
case'=': Pop_OPTR(OPTR,ch); p++;
break;
case'>': Pop_OPND(OPND,b); Pop_OPND(OPND,a);
Pop_OPTR(OPTR,theta);
Push(OPND,Operate(a,theta,b));
break;
}
}
return GetTop(OPND);
}
void main(){
char a[50];
int result;
SqStack OPTR,OPND;
InitStack(OPTR);
InitStack(OPND);
printf("請輸入一個只包含整數的加減乘除運算的表示式:\n");
gets(a);
result=EvaluateExpression(OPTR,OPND,a);
printf("表示式結果為:\n");
printf("%d",result);
printf("\n");
}
結果:
Direction:
程式碼僅代表本人初識資料結構時思路。