|

楼主 |
发表于 2017-4-3 19:55:13
|
显示全部楼层
- void print_list(const p_list head) //打印链表
- {
- p_list temp = head;
- for (; temp != NULL; temp = temp->next)
- {
- if (temp->number == (double)0xcccccccccccccccc)
- printf("%c ", temp->symbol);
- else
- printf("%f ", temp->number);
- }
- }
- p_list m_bracket(p_list p_temp,p_list &temp, char *stuck_symbol, int i, bool(*p_function)(const char a, const char b))
- //遇到括号时调用的函数
- {
- char *temp_stuck_symbol = stuck_symbol + i; //其中第一个参数对应中缀式节点,第二个对应后缀式节点
- int t_i = 0;
- for (p_temp = p_temp->next; p_temp->symbol != ')'; p_temp = p_temp->next) //第三个是符号栈,第四个是地址偏移量
- {
- if (p_temp->symbol == '(') //第五个是优先级判断函数,此函数需要用户按照需求自定义
- {
- p_temp = m_bracket(p_temp, temp, temp_stuck_symbol, t_i, p_function); //递归调用括号中遇到括号时的情况
- if (p_temp->symbol == ')')
- break;
- }
- if (p_temp->symbol == 0)
- {
- if (temp == NULL)
- frist_time(temp);
- else
- creat_list(temp);
- temp->number = p_temp->number;
- temp->symbol = 0;
- continue;
- }
- if (t_i == 0 || p_function(stuck_symbol[t_i - 1], p_temp->symbol))
- {
- temp_stuck_symbol[t_i] = p_temp->symbol;
- ++t_i;
- }
- else
- {
- for (--t_i; t_i >= 0 && !p_function(temp_stuck_symbol[t_i], p_temp->symbol); --t_i)
- {
- creat_list(temp);
- temp->symbol = temp_stuck_symbol[t_i];
- temp->number = (double)0xcccccccccccccccc;
- }
- ++t_i;
- temp_stuck_symbol[t_i] = p_temp->symbol;
- ++t_i;
- }
- }
- for (--t_i; t_i >= 0; --t_i)
- {
- creat_list(temp);
- temp->symbol = temp_stuck_symbol[t_i];
- temp->number = (double)0xcccccccccccccccc;
- }
- p_temp = p_temp->next;
- return p_temp;
- }
- p_list Excange(p_list head,bool (*p_function)(const char a, const char b)) //中缀转换后缀主函数,函数指针为优先级判断函数,此函数需要用户按照需求自定义
- {
- p_list p_temp = head, t_head = NULL, temp;
- temp = t_head;
- char stuck_symbol[1024];
- int i = 0;
- for (; p_temp != NULL; p_temp = p_temp->next)
- {
- if (p_temp->symbol == '(') //遇到括号时
- if (temp == t_head)
- {
- p_temp = m_bracket(p_temp, t_head, stuck_symbol, i, p_function);
- temp = t_head;
- for (; t_head->prev != NULL; t_head = t_head->prev);
- if(p_temp == NULL)
- break;
- if (p_temp->symbol == ')') //当调用结束后的反括号处理(跳过对这个符号的处理)
- break;
- }
- else
- {
- p_temp = m_bracket(p_temp, temp, stuck_symbol, i, p_function);
- if (p_temp == NULL)
- break;
- if (p_temp->symbol == ')')
- break;
- }
- if (p_temp->symbol == 0)
- {
- if (t_head == NULL)
- {
- frist_time(t_head);
- temp = t_head;
- t_head->number = p_temp->number;
- t_head->symbol = 0;
- continue;
- }
- else
- creat_list(temp);
- temp->number = p_temp->number;
- temp->symbol = 0;
- continue;
- }
- if (i == 0 || p_function(stuck_symbol[i-1], p_temp->symbol))
- {
- stuck_symbol[i] = p_temp->symbol;
- ++i;
- }
- else
- {
- for (--i; i >=0&&!p_function(stuck_symbol[i], p_temp->symbol); --i)
- {
- creat_list(temp);
- temp->symbol = stuck_symbol[i];
- temp->number = (double)0xcccccccccccccccc;
- }
- ++i;
- stuck_symbol[i] = p_temp->symbol;
- ++i;
- }
- }
- for (--i; i >= 0; --i) //清空符号栈
- {
- creat_list(temp);
- temp->symbol = stuck_symbol[i];
- temp->number = (double)0xcccccccccccccccc;
- }
- BeEmpty(head);
- return t_head;
- }
- int main(void)
- {
- double sum;
- p_list head;
- head = scan_list();
- head = Excange(head,priority);
- print_list(head);
- sum = calc(head);
- printf("\nsum is : %f", sum);
- return 0;
- }
复制代码 |
|