求字串表示式的值

2021-06-01 07:12:49 字數 2520 閱讀 2023

求字串表示式的值,這裡主要使用的知識是棧.為了更好的使用,這裡定義乙個棧標頭檔案,其中包括基本的棧操作.

#ifndef stack_h

#define stack_h

typedef char datatype;

typedef struct

stack;

void init_stack(stack *s, int n = 100)/*棧的初始化*/

s->top = 0;

}void destroy_stack(stack *s)/*棧的銷毀*/

void push_stack(stack *s, datatype val)/*入棧操作*/

else

}int is_empty(stack *s)/*檢視棧是否為空*/

datatype pop_stack(stack *s)/*出棧操作*/

else

}datatype get_top(stack *s)/*取得棧頂元素*/

else

}#endif

求表示式的值,首先將表示式轉換成字尾表示式, 然後再求字尾表示式的值.(這裡字串表示式的格式未能完全檢測是否正確)

/*

author: mcdragon

date: 26-10-11 09:23

description: 計算字串表示式的值(支援括號與小數).

*/#include #include #include "stack.h"

#define str_len 100

int braket_match(char *str, stack *s); /*檢測乙個表示式的括號是否匹配:*/

double calulate(char *str); /*求出字尾表示式的值*/

void change_expr(char *input, char *out, int len); /*將中綴表示式轉換成字尾表示式*/

int is_operator(char ch); /*判斷是否是運算子*/

int is_digit(char ch); /*判斷是否是數字*/

int priority(char ch); /*返回運算子的優先順序*/

int main()

else

change_expr(str, post_str, str_len);

//printf("%s\n",post_str);

printf(" = %.3f\n", calulate(post_str));

destroy_stack(&s);

getchar();getchar();

return 0;

}double calulate(char *str)

else

}if (point_position)

}doub_stack[doub_stack_top++] = tmp;

}if(is_operator(str[i]))

}i++;

}return doub_stack[0];

}int braket_match(char *str, stack *s)

if(str[i] == ')' || str[i] == ']' || str[i] == '}')

break;

case ']':

if (pop_stack(s) != '[')

break;

case '}':

if (pop_stack(s) != '

break;

default:

break;}}

i++;

}return (is_empty(s)) ? 1 : 0;

}/*將中綴表示式表示成字尾表示式*/

void change_expr(char *input, char *out, int len)

else if(input[i] == ')')

while(get_top(&op_stack) != '(')

pop_stack(&op_stack);

}

else if(is_operator(input[i]))

else

if(is_empty(&op_stack) || priority(input[i]) > priority(get_top(&op_stack)))}}

else

out[j++] = ' ';

i--;

}i++;

}while(!(is_empty(&op_stack)))

out[j] = '\0';

destroy_stack(&num_stack);

destroy_stack(&op_stack);

}int is_operator(char ch)

int is_digit(char ch)

int priority(char ch)

}

最後輸出結果:

計算字串表示式的值

舉個簡單的例子,平常我們寫的數學表示式a b,就是一種中綴表示式,寫成字尾表示式就是ab 再舉乙個複雜的例子,中綴表示式 a b c a b e的逆波蘭式是ab c ab e 1 首先,需要分配1個棧,用於臨時儲存運算子,此運算子在棧內遵循越往棧頂優先順序越高的原則 2 從中綴式的左端開始逐個讀取字...

字串 中綴 字尾 計算表示式的值

includeusing namespace std include define maxsize 100 stackstack1 棧來放字尾表示式的符號 char suffix maxsize 轉化後的字尾表示式 int n 1 表示suffix字元陣列的index,初始化為 1 int prio...

shell 字串 表示式

在shell程式設計中,經常要處理一些字串變數。比如,計算長度啊 擷取子串啊 字元替換啊等等,常常要用到awk expr sed tr等命令。下面給大家介紹個簡單的字串處理方法,用不著巢狀複雜的子命令。計算value字串的字元數量。或 刪除value字串中以分隔符 匹配的右邊字元,保留左邊字元。或 ...