表达式求值-栈和队列的应用
来源:互联网 发布:mac 终端查找文件夹 编辑:程序博客网 时间:2024/04/28 08:50
#include<stdio.h>#include<stdlib.h>#define OK 1#define ERROR 0#define STACK_SIZE 20#define STACK_INCREMENT 10#define QUEUE_SIZE 20typedef int Status;typedef char StackElemtype;typedef struct Stack{StackElemtype* base;StackElemtype* top;int stackSize;}Stack;Status StackInit(Stack* s){s->base = (StackElemtype*)malloc(sizeof(StackElemtype) * STACK_SIZE);if( !s->base )return ERROR;s->top = s->base;s->stackSize = STACK_SIZE;return OK;}Status Pop(Stack* s,StackElemtype* value){if( s->base == s->top ){printf("\nstack empty\n");return ERROR;}*value = *(--(s->top));return OK;}Status Push(Stack* s,StackElemtype value){if( s->top - s->base == s->stackSize){s->base = (StackElemtype*)realloc(s->base,sizeof(StackElemtype) * (STACK_INCREMENT + STACK_SIZE));if( !s->base )return ERROR;s->top = s->base + STACK_SIZE;s->stackSize = STACK_SIZE + STACK_INCREMENT;}*(s->top) = value;s->top++;return OK;}int StackLength(Stack s){return s.top - s.base;}typedef double StackElemtype_ForValueExperssion;typedef struct Stack_2{StackElemtype_ForValueExperssion* base;StackElemtype_ForValueExperssion* top;int stackSize;}Stack_2;Status StackInit_2(Stack_2* s){s->base = (StackElemtype_ForValueExperssion*)malloc(sizeof(StackElemtype_ForValueExperssion) * STACK_SIZE);if( !s->base )return ERROR;s->top = s->base;s->stackSize = STACK_SIZE;return OK;}Status Pop_2(Stack_2* s,StackElemtype_ForValueExperssion* value){if( s->base == s->top ){printf("\nstack empty\n");return ERROR;}*value = *(--(s->top));return OK;}Status Push_2(Stack_2* s,StackElemtype_ForValueExperssion value){if( s->top - s->base == s->stackSize){s->base = (StackElemtype_ForValueExperssion*)realloc(s->base,sizeof(StackElemtype_ForValueExperssion) * (STACK_INCREMENT + STACK_SIZE));if( !s->base )return ERROR;s->top = s->base + STACK_SIZE;s->stackSize = STACK_SIZE + STACK_INCREMENT;}*(s->top) = value;s->top++;return OK;}typedef double QueueElemtype;typedef char QueueOperatorValue;typedef struct QueueNode{QueueElemtype data;QueueOperatorValue operator;struct QueueNode* next;int flag;}QueueNode,*QueueNodePtr;typedef struct Queue{QueueNodePtr front;QueueNodePtr rear;}Queue;Status QueueInit(Queue* q){q->front = (QueueNodePtr)malloc(sizeof(QueueNode));if( !q->front )return ERROR;q->rear = q->front;q->rear->next = NULL;return OK;}Status QueueInsert(Queue* q,QueueElemtype value){QueueNodePtr new;new = (QueueNodePtr)malloc(sizeof(QueueNode));if( !new )return ERROR;new->data = value;new->flag = 1;new->next = NULL;q->rear->next = new;q->rear = new;return OK;}Status QueueInsert_operatorValue(Queue* q,QueueOperatorValue value){QueueNodePtr new;new = (QueueNodePtr)malloc(sizeof(QueueNode));if( !new )return ERROR;new->operator = value;new->flag = 0;new->next = NULL;q->rear->next = new;q->rear = new;return OK;}Status QueueDelete(Queue* q,QueueElemtype* value,QueueOperatorValue *operator,int* symbol){QueueNodePtr first;if( q->front == q->rear )return ERROR;first = q->front->next;if( first->flag == 1 ){*value = first->data;*symbol = 1;}else{*operator = first->operator;*symbol = 0;}q->front->next = first->next;if( first == q->rear ){q->rear = q->front;}return OK;}/* 利用栈将中缀表达式转化为后缀表达式: * —————————————————————————————————————————————————————————————— * | 用户的输入 | 进行的处理| * |0~9: | 直接输出到控制台| * |/,*,( | 直接Push| * |+,- | 将栈中的元素Pop直到1.栈空或者是2.遇到( | * |) | 在遇到(之前将栈中的元素全部Pop| * —————————————————————————————————————————————————————————————— * */Status Infix2Postfix(Queue* q){//Queue q;//QueueInit(&q);Stack s;StackInit(&s);char c,e;char bufferDigit[10];int i = 0;double longDigit;printf(" Please Enter Infix Expression\n");printf("------------NOTE: end of '#'--------------\n");scanf("%c", &c);while( '#' != c){while( c <= '9' && c >= '0' || '.' == c ){bufferDigit[i++] = c;bufferDigit[i] = '\0';scanf("%c", &c);if(!((c <= '9' && c >= '0' ) || '.' == c )){longDigit = atof(bufferDigit);QueueInsert(q,longDigit);i = 0;}}if( '(' == c || '*' == c || '/' == c ){Push(&s, c);}else if( '+' == c || '-' == c ){if( !StackLength(s) )Push(&s, c);else{Pop(&s, &e);while( '(' != e ){QueueInsert_operatorValue(q, e);if( StackLength(s) == 0 ){break;}elsePop(&s, &e);}if( '(' == e )Push(&s, e);Push(&s, c);}}else if( ')' == c ){Pop(&s, &e);while( '(' != e ){QueueInsert_operatorValue(q, e);Pop(&s, &e);}}else if( '#' == c){break;}else{printf("input ERROR!\n");return ERROR;}scanf("%c", &c);}while(StackLength(s)){Pop(&s, &e);QueueInsert_operatorValue(q, e);}QueueInsert_operatorValue(q,'#');return OK;}Status ShowQueue(Queue q){printf("The Reverse Polish Notation is:");if(q.front == q.rear){printf("Queue Empty");return ERROR;}QueueNodePtr p = q.front->next;while(p != q.rear){if(p->flag)printf("%g ", p->data);elseprintf("%c ", p->operator);p = p->next;}printf("\n");return OK;}/* 利用栈求解后缀表达式(逆波兰表达式)的值。 * —————————————————————————————————————————————————————————————————————— * | +,-,*,/, | 将栈顶的两个元素弹出进行计算,将结果压入栈顶 | * | 数字 | 将其压入栈顶 | * ——————————————————————————————————————————————————————————————————————— * */Status ValueExpression(Queue q){Stack_2 s;StackInit_2(&s);double o1;double o2;QueueElemtype number;QueueOperatorValue operator;int symbol;QueueDelete(&q,&number,&operator,&symbol);while( symbol == 1 || ( symbol == 0 && '#' != operator)){if(symbol == 1){Push_2(&s, number);}else if(symbol == 0){switch(operator){case '+':Pop_2(&s,&o1);Pop_2(&s,&o2);Push_2(&s,o2 + o1);break;case '-':Pop_2(&s,&o1);Pop_2(&s,&o2);Push_2(&s,o2 - o1);break;case '*':Pop_2(&s,&o1);Pop_2(&s,&o2);Push_2(&s,o2 * o1);break;case '/':Pop_2(&s,&o1);Pop_2(&s,&o2);Push_2(&s,o2 / o1);break;}}QueueDelete(&q,&number,&operator,&symbol);}Pop_2(&s,&o1);printf("The Value of the Expression is %g\n",o1);return OK;}int main(){Queue q;QueueInit(&q);Infix2Postfix(&q);ShowQueue(q);/*QueueElemtype number;QueueOperatorValue operator;int symbol;QueueDelete(&q,&number,&operator,&symbol);printf("%f,%c,%d\n",number,operator,symbol);*/ValueExpression(q);//Stack/*Stack s;StackInit(&s);StackElemtype c;Push(&s,'1');Push(&s,'2');Push(&s,'3');Push(&s,'4');Pop(&s,&c);printf("%c ", c);Pop(&s,&c);printf("%c ", c);Pop(&s,&c);printf("%c ", c);Pop(&s,&c);printf("%c ", c);*///Queue/*Queue q;QueueElemtype c;QueueInit(&q);QueueInsert(&q,1);QueueInsert(&q,2);QueueInsert(&q,3);QueueInsert(&q,4);QueueDelete(&q,&c);printf("%d ", c);QueueDelete(&q,&c);printf("%d ", c);QueueDelete(&q,&c);printf("%d ", c);QueueDelete(&q,&c);printf("%d ", c);if(QueueDelete(&q,&c)){printf("%d ",c);}*//*Queue q;QueueInit(&q);QueueInsert(&q,2.1);QueueInsert_operatorValue(&q,'+');QueueInsert(&q,43.1);QueueInsert_operatorValue(&q,'a');QueueInsert_operatorValue(&q,'(');int iswho;double d;char c;QueueDelete(&q,&d,&c,&iswho);if(iswho == 1)printf("%f ",d);elseprintf("%c ", c);QueueDelete(&q,&d,&c,&iswho);if(iswho == 1)printf("%f ",d);elseprintf("%c ", c);QueueDelete(&q,&d,&c,&iswho);if(iswho == 1)printf("%f ",d);elseprintf("%c ", c);QueueDelete(&q,&d,&c,&iswho);if(iswho == 1)printf("%f ",d);elseprintf("%c ", c);*/return 0;}
0 0
- 表达式求值-栈和队列的应用
- 栈和队列-算术表达式的求值
- 栈和队列的应用之"表达式求值"和"魔王语言"
- 【数据结构】实验二:栈与队列的应用---表达式求值
- 栈的应用 表达式求值
- 表达式求值【栈的应用】
- 栈的应用表达式求值
- 栈的应用-表达式求值
- 栈的应用 表达式求值
- 栈应用 表达式求值
- 栈的应用-四则运算表达式的求值
- 栈的一个应用表达式求值
- 栈的应用--算术表达式求值
- 表达式求值(栈的应用)(C++)
- 栈的应用——表达式求值
- 数据结构 栈的应用-- 表达式求值
- 四则运算表达式求值(栈的应用)
- NYOJ 35 表达式求值【栈的应用】
- struts2学习(一) 环境搭建以及简单的演示程序
- uVA311包裹包含
- 基于CentOS7开发之路 --- 第四章 :CentOS 7 安装 postgresql 9.5.0 数据库
- ubuntu samba服务器配置
- Java常量池详解之一道比较蛋疼的面试题
- 表达式求值-栈和队列的应用
- ios全局返回按钮和全屏侧滑功能
- Linux常用命令
- 【知识分享】提供消遣的小知识
- CentOS 手工编译、手动编译安装 MongoDB
- atexit()函数(使main函数之后可以执行其他函数)
- iOS开发基础 :UILabel属性
- 面向对象--闭包
- KMP算法