表达式计算实验3
来源:互联网 发布:豆瓣fm for windows 编辑:程序博客网 时间:2024/05/24 01:47
#include "stdio.h"#include "conio.h"#include "string.h"#include "stdlib.h"#define null 0typedef struct node{ char item[10]; struct node *next;}node;//定义链式堆栈元素类型char sexpression[200],temp[20],opr[20]; typedef struct stack{ node *top;}stack; //定义链式堆栈类型typedef struct queuenode{ char item[10]; struct queuenode *next;}queuenode;//定义链式队列元素类型typedef struct queue{ queuenode *front; queuenode *rear;}queue;//定义链式队列类型stack *createstack() //创建一个空堆栈(不带头结点的链栈){ stack *s=(stack *)malloc(sizeof(stack)); if(s==null) exit(0); else s->top=null; return s;}int stackempty(stack *s) //判断堆栈是否为空{ if(!s) { printf("\nStack if not exit!\n"); exit(0); } if(s->top==null) return 1; else return 0;} node *makenode(char *item) //创建一个堆栈结点,并使其数据域等于item{ node *pnode; pnode=(node *)malloc(sizeof(node)); if(!pnode) exit(0); else { strcpy(pnode->item,item); pnode->next=null; } return pnode;}void push(char *item,stack *s)//压栈{ node *pnode=makenode(item); pnode->next=s->top; s->top=pnode;}void pop(char *item,stack *s)//出栈{ node *pnode; if(!stackempty(s)) { pnode=s->top; strcpy(item,pnode->item); s->top=pnode->next; free(pnode); }}void clearstack(stack *s)//清空堆栈{ node *pnode; while(!stackempty(s)) { pnode=s->top; s->top=pnode->next; free(pnode); }}int stacksize(stack *s)//计算栈中结点的个数{ int i=0; node *pnode; if(!stackempty(s)) { for(pnode=s->top;!pnode; pnode=pnode->next) i++; } return i;}void stacktop(char *item,stack *s)//取栈顶元素,但不把栈顶元素出栈{ if(!stackempty(s)) { strcpy(item,s->top->item); } }queuenode *makequeuenode(char *item)//创建一个链队列结点,并使其数据域等于item{ queuenode *pnode; pnode=(queuenode *)malloc(sizeof(queuenode)); if(pnode==null) exit(0); else { strcpy(pnode->item,item); pnode->next=null; } return pnode; }queue *createqueue() //创建一个空队列,不带头结点{ queue *q=(queue *)malloc(sizeof(queue)); if(q==null) exit(0); else { q->front=q->rear=null; } return q;}int queueempty(queue *q)//判断一个队列是否为空{ if(!q->front) return 1; else return 0;}void queueinsert(char *item,queue *q)//入队{ queuenode *pnode=makequeuenode(item); if(queueempty(q)) q->front=q->rear=pnode; else { q->rear->next=pnode; q->rear=pnode; }}void queuedel(char *item,queue *q)//出队{ queuenode *pnode; if(queueempty(q)) printf("出队错误,队列为空!\n"); else { pnode=q->front; strcpy(item,pnode->item); q->front=pnode->next; free(pnode); }}int queuesize(queue *q)//求队列长度{ int i=0; queuenode *pnode; if(!queueempty(q)) { for(pnode=q->front;!pnode; pnode=pnode->next) i++; } return i;}void clearqueue(queue *q)//清空队列{ queuenode *pnode; while(!queueempty(q)) { pnode=q->front; q->front=pnode->next; free(pnode); } }void queuefront(char *item,queue *q)//取队头元素,但并不出队{ if(!queueempty(q)) { strcpy(item,q->front->item); }}void printqueue(queue *q)//输出队列中的元素{ queuenode *pnode; if(!queueempty(q)) { printf("\n队列元素:"); pnode=q->front; while(pnode) { printf("%s ,",pnode->item); pnode=pnode->next; } }}void printstack(stack *s)//输出堆栈中的元素{ node *pnode; if(!stackempty(s)) { printf("\n堆栈元素:"); pnode=s->top; while(pnode) { printf("%s ,",pnode->item); pnode=pnode->next; } }}int priorty(char opr)//求运算符号优先级{ switch(opr) { case '(': return 0; case '-': return 1; case '+': return 1; case '*': return 2; case '/': return 2; }}void caculate(queue *q)//计算后缀表达式的数值,要求最初参与运算的数值是整数{ char temp[20],opr[20],num[20]; double fa,fb; stack *stack_num=null; stack_num=createstack(); while(!queueempty(q)) { queuedel(opr,q); if((opr[0]>='0'&&opr[0]<='9')||(opr[0]=='.')) push(opr,stack_num); else { pop(num,stack_num); fb=atof(num); pop(num,stack_num); fa=atof(num); switch(opr[0]) { case '+':fa+=fb;break; case '-':fa-=fb;break; case '*': fa*=fb;break; case '/': if(fb==0) { printf("\n除0出错!"); exit(0); } else { fa/=fb; break; } } sprintf(num,"%f",fa); push(num,stack_num); } } pop(num,stack_num); printf("\n运算结果是:%s",num);}stack *stack_opr=null;queue *queue_exp=null;void Process(){ int i=0; int isnum,j; while(sexpression[i]!='\0') { isnum=j=0; while(sexpression[i]>='0'&&sexpression[i]<='9') { isnum=1;temp[j++]=sexpression[i++]; } if(isnum) { temp[j]='\0';queueinsert(temp,queue_exp); } else { temp[0]=sexpression[i++]; temp[1]='\0'; switch(temp[0]) { case '(':push(temp,stack_opr);break; case '+': case '-': case '*': case '/': if(!stackempty(stack_opr)) while(priorty(temp[0])<=priorty(stack_opr->top->item[0])) { pop(opr,stack_opr); queueinsert(opr,queue_exp); if(stackempty(stack_opr)) break; } push(temp,stack_opr); break; case ')': while(stack_opr->top->item[0]!='(') { pop(opr,stack_opr); queueinsert(opr,queue_exp); } pop(opr,stack_opr); break; } } printstack(stack_opr); printqueue(queue_exp); }} int main(){ int i,j,isnum; printf("\n请输入待计算的表达式(中缀式):\n"); gets(sexpression); printf("%s",sexpression); stack_opr=createstack(); queue_exp=createqueue(); //i=0; Process(); /*while(sexpression[i]!='\0') { isnum=j=0; while(sexpression[i]>='0'&&sexpression[i]<='9') { isnum=1;temp[j++]=sexpression[i++]; } if(isnum) { temp[j]='\0';queueinsert(temp,queue_exp); } else { temp[0]=sexpression[i++]; temp[1]='\0'; switch(temp[0]) { case '(':push(temp,stack_opr);break; case '+': case '-': case '*': case '/': if(!stackempty(stack_opr)) while(priorty(temp[0])<=priorty(stack_opr->top->item[0])) { pop(opr,stack_opr); queueinsert(opr,queue_exp); if(stackempty(stack_opr)) break; } push(temp,stack_opr); break; case ')': while(stack_opr->top->item[0]!='(') { pop(opr,stack_opr); queueinsert(opr,queue_exp); } pop(opr,stack_opr); break; } } printstack(stack_opr); printqueue(queue_exp); }*/ while(!stackempty(stack_opr)) { pop(opr,stack_opr); queueinsert(opr,queue_exp); } caculate(queue_exp); printstack(stack_opr); printqueue(queue_exp); getch();}
0 0
- 表达式计算实验3
- C语言实验--计算表达式
- C语言实验——计算表达式
- C语言实验——计算表达式
- C语言实验——计算表达式
- C语言实验——计算表达式
- C语言实验——计算表达式
- C语言实验——计算表达式
- 1199C语言实验——计算表达式
- 数据结构实验:栈实现计算器(表达式计算)
- 2020: C语言实验——计算表达式
- ytu 2020: C语言实验——计算表达式
- C语言实验——计算表达式 (sdut oj)
- SDUT-1199 C语言实验——计算表达式
- |1199|C语言实验——计算表达式
- p1042表达式计算3
- C++实验3-个人所得税计算
- C++实验3 个人所得税计算
- VC6 ”add files to project“功能失效的解决方案
- __IPHONE_OS_VERSION_MAX_ALLOWED理解
- Minimum Path Sum - Leetcode
- SQL数据是否存在(是否有数据)判断,表,存储过程是否存在
- C语言及程序设计初步例程-26 利用switch语句解决问题
- 表达式计算实验3
- BMP085大气压传感器
- 类模板 实现链表
- java 二分法查找
- LeetCode Path Sum
- angularJS中的$injector、$rootScope和$scope的概念和关联关系
- 数据库定义规范(可以借鉴,不是硬性标准)
- 打造史上最容易使用的Tab指示符——Indicator
- online_judge_1472