//括号运算优先级判断
//之逆波兰表达式
#include<stdio.h>
#include<stdlib.h>
typedef struct expretion {
char element;
struct expretion* next;
}expretion,*linklist;
//存储表达式
linklist input_exprexion(char a,linklist rear) {
linklist node = (linklist)malloc(sizeof(expretion));
if (node == NULL) {
return NULL;
}
node->element = a;
node->next = NULL;
rear->next = node;
rear = node;
return rear;
}
void show(linklist head) {
linklist p = head->next;
while (p) {
printf("%c",p->element);
p = p->next;
}
}
linklist push(char e,linklist node) {
linklist head = (linklist)malloc(sizeof(expretion));
if (head == NULL) {
return NULL;
}
node -> element = e;
head->next = node;
return head;
}
linklist pop(linklist head) {
linklist p = head->next;
head->next = p->next;
free(p);
return head;
}
void put_in(linklist head1) {
linklist p = head1->next;
linklist rear = (linklist)malloc(sizeof(expretion));
if (rear == NULL) {
return;
}
linklist head = rear;
linklist head2 = (linklist)malloc(sizeof(expretion));
if (head2 == NULL) {
return;
}
head2->next = NULL;
while (p != NULL) {
if (p->element != '(' && p->element != '+' && p->element != '-'
&& p->element != '*' && p->element != '/'
&& p->element != '%' && p->element != ')') {
rear = input_exprexion(p->element,rear);
}
else {
//压栈
head2 = push(p->element, head2);
if (p->element == ')') {
head2 = pop(head2);
linklist q = head2->next;
while (q->element != '(') {
rear = input_exprexion(q->element, rear);
head2 = pop(head2);
q = head2->next;
}
head2 = pop(head2);
}
}
p = p->next;
}
linklist w = head2->next;
while (w) {
rear = input_exprexion(w->element, rear);
head2 = pop(head2);
w = head2->next;
}
show(head);
}
int main() {
char a = 'a';
linklist rear1 = (linklist)malloc(sizeof(expretion));
if (rear1 == NULL) {
return 0;
}
linklist head1 = rear1;
rear1->next = NULL;
while (a != '\n') {
scanf_s("%c",&a,sizeof(char));
if (a != '\n') {
rear1 = input_exprexion(a, rear1);
}
}
//show(head1);
put_in(head1);
return 0;
}
//例:1+(2*3)-(3%2)
//例子的逆波兰表达式为:123*32%-+