求字串表示式的值,這裡主要使用的知識是棧.為了更好的使用,這裡定義乙個棧標頭檔案,其中包括基本的棧操作.
#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字串中以分隔符 匹配的右邊字元,保留左邊字元。或 ...