数据结构——表达式求值

  
    
#include < iostream >
using namespace std;

#define StackSize 100
typedef
struct
{
char data[StackSize];
int top;
}SeqStack1;
// 操作符栈
typedef struct
{
int data[StackSize];
int top;
}SeqStack2;
// 数据栈

char a[] = { ' + ' , ' - ' , ' * ' , ' / ' , ' ( ' , ' ) ' , ' # ' };
char PriorityTable[ 7 ][ 7 ] = { { ' > ' , ' > ' , ' < ' , ' < ' , ' < ' , ' > ' , ' > ' },
{
' > ' , ' > ' , ' < ' , ' < ' , ' < ' , ' > ' , ' > ' },
{
' > ' , ' > ' , ' > ' , ' > ' , ' < ' , ' > ' , ' > ' },
{
' > ' , ' > ' , ' > ' , ' > ' , ' < ' , ' > ' , ' > ' },
{
' < ' , ' < ' , ' < ' , ' < ' , ' < ' , ' = ' , ' N ' },
{
' > ' , ' > ' , ' > ' , ' > ' , ' N ' , ' > ' , ' > ' },
{
' < ' , ' < ' , ' < ' , ' < ' , ' < ' , ' N ' , ' = ' } };

// 初始化顺序栈
void init(SeqStack1 * s1)
{
s1
-> top = 0 ;
}
void init(SeqStack2 * s2)
{
s2
-> top = 0 ;
}

// 压入到操作符栈
void Push(SeqStack1 * s1, char x)
{
++ s1 -> top;
s1
-> data[s1 -> top] = x;
}
// 压入到数据栈
void Push(SeqStack2 * s2, int x)
{
++ s2 -> top;
s2
-> data[s2 -> top] = x;
}

// 操作符栈顶元素弹出进行运算
char Pop(SeqStack1 * s1)
{
return s1 -> data[s1 -> top -- ];
}
// 弹出数据栈顶元素去进行运算
int Pop(SeqStack2 * s2)
{
return s2 -> data[s2 -> top -- ];
}

// 取操作栈顶的运算符和新读到的运算符比较优先顺序
char gettop(SeqStack1 * s1)
{
return s1 -> data[s1 -> top];
}
// 取数据栈顶元素
int gettop(SeqStack2 * s2)
{
return s2 -> data[s2 -> top];
}

// 比较操作符优先顺序
char compare( char ch1, char ch2)
{
int i,j;
for (i = 0 ;i < 7 ;i ++ )
if (a[i] == ch1)
break ;
for (j = 0 ;j < 7 ;j ++ )
if (a[j] == ch2)
break ;
return PriorityTable[i][j];
}

// 执行操作符运算
int Operate( int a, char theta, int b)
{
if (theta == ' + ' )
return a + b;
else if (theta == ' - ' )
return a - b;
else if (theta == ' * ' )
return a * b;
else
return a / b;
}

// 显示操作符栈
void display_seqstack(SeqStack1 * s1)
{
if (s1 -> top == 0 )
cout
<< " is empty! " ;
else
{
int temp = s1 -> top;
while (temp != 0 )
cout
<< s1 -> data[temp -- ] << " " ;
}
}
// 显示数据栈
void display_seqstack(SeqStack2 * s2)
{
int temp = s2 -> top;
while (temp != 0 )
cout
<< s2 -> data[temp -- ] << " " ;
}
// 输入表达式
void inputExpress( char * express)
{
int length = 0 ;
printf(
" 请输入一个表达式: " );
scanf(
" %s " ,express);
int len = strlen(express);
express[len]
= ' # ' ; // 表达式最后一位默认为'#';
express[len + 1 ] = ' \0 ' ;
}

int main()
{
SeqStack2
* OPND;
OPND
= (SeqStack2 * ) malloc( sizeof (SeqStack2));
// 初始化操作数栈
init(OPND);

SeqStack1
* OPTR;
OPTR
= (SeqStack1 * ) malloc( sizeof (SeqStack1));
// 初始化操作数栈
init(OPTR);
Push(OPTR,
' # ' );


// 输入表达式
char express[ 100 ];
inputExpress(express);
// 输入表达式
int i = 0 ;
while (express[i] != ' # ' || gettop(OPTR) != ' # ' )
{
if (express[i] >= ' 0 ' && express[i] <= ' 9 ' ) // 不是运算符则进操作数栈
{
int num = express[i] - 48 ;
for ( int j = i + 1 ;express[j] != ' \0 ' ;j ++ ) // ******当数大于10时的处理******
{
if (express[j] >= ' 0 ' && express[j] <= ' 9 ' )
num
= num * 10 + (express[j] - 48 );
else
break ;
}
Push(OPND,num);
i
= j; // i跳到j这
}
else
switch (compare(gettop(OPTR),express[i]))
{
case ' < ' : // 栈顶元素优先权低
Push(OPTR,express[i]);
i
++ ;
break ;
case ' = ' : // 脱括号并接受下一字符
Pop(OPTR);
i
++ ;
break ;
case ' > ' : // 退出并将运算结果入栈
char theta = Pop(OPTR);
int b = Pop(OPND);
int a = Pop(OPND);
int result = Operate(a,theta,b); // 退出栈的数据运算后再入栈
Push(OPND,result);
break ;
}
// switch
display_seqstack(OPTR);
cout
<< " " ;
display_seqstack(OPND);
cout
<< endl;

}
// while
cout << endl << gettop(OPND) << endl;
return 0 ;
}

 

你可能感兴趣的:(数据结构)