栈的基本操作及应用
来源:互联网 发布:finalcut mac 破解版 编辑:程序博客网 时间:2024/06/07 06:30
/*栈的基本操作及实现表达式求值*/#include<stdio.h>#include<stdlib.h>#include<windows.h> #define STACK_INIT_SIZE 100 //存储空间初始分配量#define STACKINCREMENT 10 //存储空间分配增量#define OK 1#define OVERFLOW 0#define ERROR 0typedef int Status;typedef struct { float *base;//在栈构造之前和销毁之后,base的值为NULL float *top;//栈顶指针 int stacksize; //当前已分配的存储空间}SqStack;char sign[8]={"+-*/()#"}; //运算符之间的关系 // + - * / ( ) # char relation[7][7]={ /* + */{'>','>','<','<','<','>','>'}, /* - */{'>','>','<','<','<','>','>'}, /* * */{'>','>','>','>','<','>','>'}, /* / */{'>','>','>','>','<','>','>'}, /* ( */{'<','<','<','<','<','=',' '}, /* ) */{'>','>','>','>',' ','>','>'}, /* # */{'<','<','<','<','<',' ','='} };//构造一个空栈SStatus InitStack(SqStack &S){ S.base = (float*)malloc(STACK_INIT_SIZE * sizeof(float)); if (!S.base)exit(OVERFLOW);//存储分配失败 S.top = S.base; S.stacksize = STACK_INIT_SIZE; return OK;}Status DestroyStack(SqStack &S)//销毁栈 { free(S.base); S.stacksize=0; S.top=S.base=NULL; return OK;}Status ClearStack(SqStack &S)//清空栈 { S.top=S.base; return OK;}bool StackEmpty(SqStack &S)//判断栈是否为空 { if(S.top==S.base) return true; return false;}//取栈顶元素char GetTop(SqStack S){ if (S.top == S.base) return '#'; return char(*(S.top-1));}//插入元素e为新的栈顶元素Status Push(SqStack &S, float e){ if (S.top - S.base >= S.stacksize) {//栈满,追加存储空间 S.base = (float *)realloc(S.base, (S.stacksize + STACKINCREMENT) * sizeof(float)); if (!S.base) exit(OVERFLOW);//存储分配失败 S.top = S.base + STACKINCREMENT; S.stacksize += STACKINCREMENT; } *S.top++ = e; return OK;}//删除S 的栈顶元素 float Pop(SqStack &S){ if(StackEmpty(S))return '#'; return *(--S.top);}char Precede(char a,char b){ int i,j; switch(a) { case '+':i=0;break; case '-':i=1;break; case '*':i=2;break; case '/':i=3;break; case '(':i=4;break; case ')':i=5;break; case '#':i=6;break; } switch(b) { case '+':j=0;break; case '-':j=1;break; case '*':j=2;break; case '/':j=3;break; case '(':j=4;break; case ')':j=5;break; case '#':j=6;break; } return relation[i][j];}float Operate(float a,char opr,float b)//计算 { if(opr=='+')return a+b; else if(opr=='-')return a-b; else if(opr=='*')return a*b; else if(opr=='/') { if(b==0){printf("计算过程中出现了除数为0的情况!输出结果错误!\n");system("pause");} else return a/b; } }bool is_OPND(char c)//判断是否为数字 { if((c>='0'&&c<='9' )||c=='.')return true; return false;}void Getchar(){ while(getchar()!='\n');}int main(){ SqStack OPTR,OPND; InitStack(OPTR); InitStack(OPND); Push(OPTR,float('#')); char c; printf("请输入一个正确的算术表达式(用#号结束):\n"); scanf("%c",&c); char num[20]; int Temp=1; while(Temp) { while(c!='#'||GetTop(OPTR)!='#') { int i=0; if(is_OPND(c)) { num[i]=c; while(scanf("%c",&c)&&(is_OPND(c))) { i++;num[i]=c; } float result=(float)atof(num); Push(OPND,result); } else { switch(Precede(GetTop(OPTR),c)) { case '<':Push(OPTR,c);scanf("%c",&c);break; case '=':Pop(OPTR);scanf("%c",&c);break; case '>':float b=Pop(OPND),a=Pop(OPND); char opera=char(Pop(OPTR)); float f=Operate(a,opera,b); Push(OPND,f); } } memset(num,0,sizeof(num));} float output=Pop(OPND); getchar(); printf("该算术表达式的值为:"); printf("%.2f\n",output); printf("是否继续计算表达式?(Y/N)"); char a=getchar(); Getchar(); if(a=='Y'||a=='y') { ClearStack(OPTR); ClearStack(OPND) ; printf("请输入一个正确的算术表达式(用#结束):\n"); Push(OPTR,float('#')); scanf("%c",&c); } else Temp=0; }DestroyStack(OPTR);DestroyStack(OPND); return 0;}
阅读全文
0 0
- 栈的基本操作及应用
- 图的基本操作及应用
- 线性表的基本操作及应用
- Emacs基本操作及应用
- 算法与数据结构--图的实现、基本操作及应用
- 二叉树的基本操作及应用(三)
- HDU 1022 栈的基本操作应用
- C++栈的基本操作和应用
- 栈的基本操作和应用
- Lua的栈及基本栈操作
- 栈的实现及基本操作
- 链栈的基本操作及回文
- 栈的实现及基本操作
- 栈的基本操作及实现
- 20150603指针基本操作及应用
- 7.6 栈与队列-栈的基本操作和应用
- 栈和队列的基本操作及其应用
- 实验项目二:栈的基本操作及其应用
- cd 在windows下 无法切换盘符目录
- ThinkPHP框架中使用selected
- Java四种线程池的使用
- 前缀表达式运算
- IntelliJ IDEA 创建Maven 工程
- 栈的基本操作及应用
- python 网络框架twisted基础学习及详细讲解
- 听课笔记(17-8-16)
- 数据结构实验之图论二:基于邻接表的广度优先搜索遍历
- Android非常好用的自定义dialog
- 关于Grafika的RecordFboActivity
- 反向传导算法笔记
- 之字形二叉树
- c++ 中 pair 的 使用方法