栈和队列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;

}

相关推荐
Vect__2 小时前
链表漫游指南:C++ 指针操作的艺术与实践
数据结构·c++·链表
古译汉书2 小时前
蓝桥杯算法之基础知识(2)——Python赛道
数据结构·python·算法·蓝桥杯
.Vcoistnt2 小时前
Codeforces Round 1043 (Div. 3)(A-E)
数据结构·算法
野犬寒鸦2 小时前
力扣hot100:搜索二维矩阵与在排序数组中查找元素的第一个和最后一个位置(74,34)
java·数据结构·算法·leetcode·list
啊吧怪不啊吧10 小时前
C++之list类的代码及其逻辑详解 (中)
开发语言·数据结构·c++·list
楼田莉子11 小时前
C++算法学习专题:滑动窗口
开发语言·数据结构·c++·学习·算法·leetcode
zh_xuan12 小时前
LeeCode 40.组合总和II
c语言·数据结构·算法
wangluoqi13 小时前
c++ 数据结构-并查集、ST表 小总结
数据结构·c++
小马学嵌入式~1 天前
数据结构:队列 二叉树
c语言·开发语言·数据结构·算法
省四收割者1 天前
Go语言入门(10)-数组
数据结构·经验分享·笔记·vscode·算法·golang