逆波兰的算法c语言,leetcode150(逆波兰运算)--C语言实现

求:

根据逆波兰表示法,求表达式的值。

有效的运算符包括 +, -, *, / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。

说明:

整数除法只保留整数部分。

给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。

示例 1:

输入: ["2", "1", "+", "3", "*"]

输出: 9

解释: ((2 + 1) * 3) = 9

示例 2:

输入: ["4", "13", "5", "/", "+"]

输出: 6

解释: (4 + (13 / 5)) = 6

示例 3:

输入: ["10", "6", "9", "3", "+", "-11", "*", "/", "*", "17", "+", "5", "+"]

输出: 22

解释:

((10 * (6 / ((9 + 3) * -11))) + 17) + 5

= ((10 * (6 / (12 * -11))) + 17) + 5

= ((10 * (6 / -132)) + 17) + 5

= ((10 * 0) + 17) + 5

= (0 + 17) + 5

= 17 + 5

= 22

解:

1、程序代码

int

evalRPN(

char

** tokens,

int

tokensSize){

int

i;

int

result;

stack* st = createStack();

for

(i=

0

;i

char

* str = tokens[i];

if

(strlen(str)==

1

&& (str[

0

]==

'+'

|| str[

0

]==

'-'

|| str[

0

]==

'*'

|| str[

0

]==

'/'

)){

int

j = pop(st);

int

k = pop(st);

if

(str[

0

]==

'+'

){

push(st,k+j);

}

else

if

(str[

0

]==

'-'

){

push(st,k-j);

}

else

if

(str[

0

]==

'*'

){

push(st,k*j);

}

else

if

(str[

0

]==

'/'

){

push(st,k/j);

}

}

else

{

push(st,convertToNumber(str));

}

}

result = pop(st);

freeStack(st);

return

result;

}

2、ADT部分

a.链表实现栈

typedef

struct

StackNode{

int

val;

struct

StackNode *next;

}stackNode;

typedef

struct

Stack{

struct

StackNode* top;

}stack;

void

push(stack* s,

int

val){

stackNode* top = s->top;

stackNode* newNode = (stackNode*)malloc(

sizeof

(

struct

StackNode));

newNode->val = val;

newNode->next = top->next;

top->next = newNode;

}

int

pop(stack *s){

struct

StackNode* top = s->top;

int

val = top->next->val;

top->next = top->next->next;

return

val;

}

stack* createStack(){

stack* s = (stack*)malloc(

sizeof

(stack));

stackNode* top = (stackNode*)malloc(

sizeof

(

struct

StackNode));

top->next = NULL;

s->top = top;

return

s;

}

void

freeStack(stack* s){

stackNode* top = s->top;

stackNode* tmp;

while

(top->next!=NULL){

tmp = top->next;

top->next = tmp ->next;

free(tmp);

}

}

int

convertToNumber(

char

*str) {

int

result =

0

;

if

(*str ==

'-'

) {

for

(

int

i =

1

; i 

result = result *

10

+ (*(str + i) -

'0'

);

}

result*=-

1

;

}

else

{

for

(

int

i =

0

; i 

result = result *

10

+ (*(str + i) -

'0'

);

}

}

return

result;

}

b.数组实现栈

typedef

struct

Stack{

int

size;

int

* arr;

int

top;

}stack;

void

push(stack* s,

int

val){

s->top++;

s->arr[s->top]=val;

}

int

pop(stack *s){

int

value = s->arr[s->top];

s->top--;

return

value;

}

void

emptyStack(stack* s){

s->top=-

1

;

}

void

freeStack(stack* s){

s->top = -

1

;

s->size =

0

;

free(s->arr);

}

stack* createStack(

int

size){

stack* s = (stack*)malloc(

sizeof

(stack));

s->size = size;

s->top = -

1

;

int

* arr = (

int

*)malloc(

sizeof

(

int

)*size);

s->arr = arr;

return

s;

}

int

convertToNumber(

char

*str) {

int

result =

0

;

if

(*str ==

'-'

) {

for

(

int

i =

1

; i 

result = result *

10

+ (*(str + i) -

'0'

);

}

result*=-

1

;

}

else

{

for

(

int

i =

0

; i 

result = result *

10

+ (*(str + i) -

'0'

);

}

}

return

result;

}

来源:oschina

链接:https://my.oschina.net/u/4469818/blog/3213761

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值