1. 程式人生 > 其它 >資料結構:棧的應用(中綴表示式)

資料結構:棧的應用(中綴表示式)

技術標籤:資料結構c語言資料結構演算法

一、要求:

輸入一個表示式,表示式中只包含整數和加、減、乘、除四種雙目運算子,計算給定表示式的值(參考中綴表示式求值)

二、程式碼:

#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:

程式碼僅代表本人初識資料結構時思路。