栈和队列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 == OP[i])

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 OP[8] = {'+', '-', '*', '/', '(', ')', '#'};

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;

}

相关推荐
冰清-小魔鱼11 小时前
各类数据存储结构总结
开发语言·数据结构·数据库
小六子成长记12 小时前
【C++】:搜索二叉树的模拟实现
数据结构·c++·算法
菜鸟233号13 小时前
力扣377 组合总和 Ⅳ java实现
java·数据结构·算法·leetcode
我是大咖13 小时前
二级指针与指针数组搭配
c语言·数据结构·算法
D_FW13 小时前
数据结构第五章:树与二叉树
数据结构·算法
余瑜鱼鱼鱼14 小时前
Java数据结构:从入门到精通(九)
数据结构
float_六七14 小时前
设备分配核心数据结构全解析
linux·服务器·数据结构
wifi chicken15 小时前
Linux 内核开发之单链表的增删查改详解
linux·数据结构·链表
im_AMBER17 小时前
数据结构 18 【复习】广义表 | 各种内部排序 | 二叉排序树的平均查找长度 ASL
数据结构·笔记·学习·排序算法
leaves falling19 小时前
冒泡排序(基础版+通用版)
数据结构·算法·排序算法