栈和队列5 顺序栈的应用实例(表达式求值)

#include <stdio.h>

#include <stdlib.h>

#define INITSIZE 100

#define INCREAMENT 10

typedef struct{

char * data;

char * top;

int stacksize;

}OPTRStack;

typedef struct{

int * data;

int * top;

int stacksize;

}OPNDStack;

void InitOPTRStack(OPTRStack * S){

S -> data = (char *)malloc(INITSIZE * sizeof(char));

if(! S -> data) exit(0);

S -> top = S -> data;

S -> stacksize = INITSIZE;

}

void InitOPNDStack(OPNDStack * S){

S -> data = (int *)malloc(INITSIZE * sizeof(int));

if(! S -> data) exit(0);

S -> top = S -> data;

S -> stacksize = INITSIZE;

}

void PushOPTR(OPTRStack * S, char e){

if (S -> top - S -> data >= S -> stacksize){

S -> data = (char *)realloc(S -> data, (INITSIZE + INCREAMENT) * sizeof(char));

if(! S -> data) exit(0);

S -> top = S -> data;

S -> stacksize = INITSIZE + INCREAMENT;

}

* S -> top ++ = e;

}

void PushOPND(OPNDStack * S, int e){

if (S -> top - S -> data >= S -> stacksize){

S -> data = (int *)realloc(S -> data, (INITSIZE + INCREAMENT) * sizeof(int));

if(! S -> data) exit(0);

S -> top = S -> data;

S -> stacksize = INITSIZE + INCREAMENT;

}

* S -> top ++ = e;

}

void PopOPTR(OPTRStack * S, char * e){

if (S -> data == S -> top) exit(0);

* e = * -- S -> top;

}

void PopOPND(OPNDStack * S, int * e){

if (S -> data == S -> top) exit(0);

* e = * -- S -> top;

}

int GetTopOPND(OPNDStack S){

if (S.data == S.top) exit(0);

return * (S.top - 1);

}

char GetTopOPTR(OPTRStack S){

if (S.data == S.top) exit(0);

return * (S.top - 1);

}

bool In(char c, char OP\[\]){

for(int i = 0; i < 8; i++){

if(c == OPi)

return true;

}

return false;

}

char Precede(char a, char b){

int p, q;

if(a == '#')

p = 0;

else if(a == '(')

p = 1;

else if(a == '+' || a == '-')

p = 2;

else if(a == '*' || a == '/')

p = 3;

else if(a == ')')

p = 4;

if(b == '#')

q = 0;

else if(b == '(')

q = 4;

else if(b == '+' || b == '-')

q = 2;

else if(b == '*' || b == '/')

q = 3;

else if(b == ')')

q = 1;

if(a == '#' && b == '#' || a == '(' && b == ')')

return '=';

else if(p >= q)

return '>';

else if(p < q)

return '<';

}

int Operate(int a, char e, int b){

if(e == '+')

return a + b;

else if(e == '-')

return a - b;

else if(e == '*')

return a * b;

else if(e == '/')

return a / b;

}

int EvaluateExpression(){

OPTRStack OPTR;

OPNDStack OPND;

InitOPTRStack(&OPTR);

InitOPNDStack(&OPND);

PushOPTR(&OPTR, '#');

char c = getchar();

char e;

int a, b;

char OP8 = {'+', '-', '*', '/', '(', ')', '#'};

while(c != '#' || GetTopOPTR(OPTR) != '#'){

if(! In(c, OP)){

int temp = 0;

while(! In(c, OP)){

temp = temp * 10 + c - '0';

c = getchar();

}

PushOPND(&OPND, temp);

}

else{

switch(Precede(GetTopOPTR(OPTR), c)){

case '<':

PushOPTR(&OPTR, c);

c = getchar();

break;

case '=':

PopOPTR(&OPTR, &e);

c = getchar();

break;

case '>':

PopOPTR(&OPTR, &e);

PopOPND(&OPND, &b);

PopOPND(&OPND, &a);

PushOPND(&OPND, Operate(a, e, b));

break;

}

}

}

return GetTopOPND(OPND);

}

int main(){

int value = EvaluateExpression();

printf("%d", value);

return 0;

}

相关推荐
老师我太想进步了20261 天前
【数据结构-3】算法美学之降复杂度
数据结构·算法
w_zero_one2 天前
算法--构造
java·数据结构·算法
lisw052 天前
互联网上的数据结构可视化!
数据结构·信息可视化
老师我太想进步了20262 天前
【数据结构-1】例解算法复杂度
数据结构·算法
YSL0701242 天前
一文通关-----排序
数据结构·算法
夜不会漫长3 天前
C++:红黑树
数据结构·算法
冻柠檬飞冰走茶3 天前
PTA刷题集之Airline Routes(C语言实现)
c语言·开发语言·数据结构·算法
736c3 天前
固件开发岗算法
数据结构·算法
冻柠檬飞冰走茶3 天前
PTA刷题集之Battle Over Cities - Hard Version(C语言实现)
c语言·开发语言·数据结构·算法
PaperAccept3 天前
【研知有术论文发表】材料科学一区期刊,影响因子30+的纳米科技SCI,审稿严格但有效率
大数据·数据结构·科技·量子计算