逆波兰转换C语言(带注释)

更新时间:2023-12-16 11:15:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

#include #include struct stack { char letter; struct stack *next; };

int rank(char a);

void push(char a,struct stack*s); char pop(struct stack *s); void main() { char element; int i=0,j=0; struct stack *s;

////////判断运算符优先级函数

s=(struct stack*)malloc(sizeof(struct stack)); ////////创建一个运算符栈 s->next=NULL; push('@',s); ////////给栈一个起始值 while(s->next->letter!='#') { element=getchar();

////////以‘#’作为输出的结尾

if(element!='#') ////////当输入不为结尾标志时 { if((element>'a'&& element<'z') || (element>'A' && element<'Z'))

////////若输入为字母,则直接输出 printf(\ else if(rank(element)>rank(s->next->letter)) push(element,s); ////////若不为字母,则判断该运算符的优先级 else { while(rank(element)<=rank(s->next->letter) && s->next->letter!='@')

///////输入运算符的优先级高于栈顶运算符的优先级,进栈 { printf(\ ///////若优先级不高于栈顶运算符,则将栈顶弹出,并输出, } ///////直到栈顶运算符的优先级严格小于输入运算符的优先级 push(element,s); ///////或者已经到达栈底,之后将该输入的运算符进栈 }

} else push(element,s); ////////若为输入结尾标志符,直接进栈,跳出while循环 }

while(s->next->letter!='@')

////////将栈中的剩余的运算符全部弹出,并依次输出‘#’和‘@’不输出 { if(s->next->letter!='#') printf(\ else element=pop(s); } }

void push(char a,struct stack*s) { struct stack* temp; temp=(struct stack*)malloc(sizeof(struct stack)); temp->letter=a; temp->next=s->next; s->next=temp; }

char pop(struct stack *s) { struct stack* temp; char a; a=s->next->letter; temp=s->next; s->next=s->next->next; free(temp); return a; }

int rank(char a) { if(a=='+'||a=='-') return 1; else if(a=='*'||a=='/') return 2; else return 4; }

本文来源:https://www.bwwdw.com/article/6wh5.html

Top