#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<Windows.h>
#include<math.h>#define max 100
#define Malloc(type) (type*)malloc(sizeof(type))typedef struct stack
{double data[max];int top;
}stack;//字符栈typedef struct stackd
{double data[max];int top;
}stackd;//数字栈void calculator();//计算器
void push_stack(stack* p, char a);//入栈:运算符
void push_stackd(stackd* p, double a);//入栈:数字
double pop_stack(stack* p);//出栈:运算符
double pop_stackd(stackd* p);//入栈:数字
double cal(int* arr, int flag);//得到运算数(包括小数)
void destroy_stack(stack* s);//销毁栈
void destroy_stackd(stackd* s);//销毁栈(数字栈)
stack* init_stack();//初始化栈
stackd* init_stackd();//初始化栈(数字栈)int main()
{calculator();return 0;
}void calculator()
{char ch='#';int l = 0;while (1){system("cls");printf("s代表sin,c代表cos,l代表ln,r代表sqrt,t代表tan,^代表平方,p为PI,e为自然数");printf("\n示例:^5-((1+2)*4/3)+s1-r4+c3+t5\n");int flag = 0;int flag2 = 0;int arr[max] = {0};double a;int f = 0;int m, k;double formed[max] = {0};char buf[max];int i = 0;double n1 = 0;double n2 = 0;double n3 = 0;stack* p = init_stack();stackd* pp = init_stackd();if (p){scanf_s("%s", buf,max);int le = strlen(buf) + 1;for (i = 0; i < le; i++){if (buf[i] >= '0' && buf[i] <= '9'){arr[flag] = (buf[i] - '0');flag++;while ((buf[i + 1] >= '0' && buf[i + 1] < '9') || buf[i + 1] == '.'){if (buf[i + 1] >= '0' && buf[i + 1] < '9'){arr[flag] = buf[i + 1] - '0';}else if (buf[i + 1] == '.'){arr[flag] = buf[i + 1];}i++;flag++;}formed[f] = cal(arr, flag);f++;flag = 0;}else if (buf[i] == 'p'){formed[f] = 3.141592653589793238;f++;}else if (buf[i] == 'e'){formed[f] = 2.718281828459;f++;}else if (buf[i] == '('){push_stack(p, buf[i]);}else if (buf[i] == ')'){while ((a = pop_stack(p)) != '(' && p->top > 0){formed[f] = (a + 0.00123);f++;}}else if (buf[i] == '+' || buf[i] == '-'){while (1){if (p->data[p->top - 1] != 40 && p->top > 0){formed[f] = pop_stack(p) + 0.00123;f++;}elsebreak;}push_stack(p, buf[i]);}else if (buf[i] == '*' || buf[i] == '/'){while (1){if (p->data[p->top - 1] != '+' && p->data[p->top - 1] != '-' && p->top > 0 && p->data[p->top - 1] != '('){formed[f] = pop_stack(p) + 0.00123;f++;}elsebreak;}push_stack(p, buf[i]);}else if (buf[i] == '^' || buf[i] == 'r' || buf[i] == 's' || buf[i] == 'c' || buf[i] == 'l' || buf[i] == 't'){while (1){if (p->data[p->top - 1] != '+' && p->data[p->top - 1] != '-' && p->top > 0 && p->data[p->top - 1] != '(' && p->data[p->top - 1] != '*' && p->data[p->top - 1] != '/'){formed[f] = pop_stack(p) + 0.00123;f++;}elsebreak;}push_stack(p, buf[i]);}else if (buf[i] == ' ')continue;else if (buf[i] == '\0')continue;}while (p->top > 0){formed[f] = pop_stack(p) + 0.00123;f++;}}for (i = 0; i < max - 1; i++){if (formed[i] == '+' + 0.00123){n1 = (double)pop_stackd(pp);n2 = (double)pop_stackd(pp);n3 = n1 + n2;push_stackd(pp, n3);}else if (formed[i] == '-' + 0.00123){n1 = (double)pop_stackd(pp);n2 = (double)pop_stackd(pp);n3 = n2 - n1;push_stackd(pp, n3);}else if (formed[i] == '*' + 0.00123){n1 = (double)pop_stackd(pp);n2 = (double)pop_stackd(pp);n3 = n2 * n1;push_stackd(pp, n3);}else if (formed[i] == '/' + 0.00123){n1 = (double)pop_stackd(pp);n2 = (double)pop_stackd(pp);n3 = n2 / n1;push_stackd(pp, n3);}else if (formed[i] == '^' + 0.00123){n1 = (double)pop_stackd(pp);n1 = n1 * n1;push_stackd(pp, n1);}else if (formed[i] == 'r' + 0.00123){n1 = (double)pop_stackd(pp);n1 = sqrt(n1);push_stackd(pp, n1);}else if (formed[i] == 's' + 0.00123){n1 = (double)pop_stackd(pp);n1 = sin(n1);push_stackd(pp, n1);}else if (formed[i] == 'c' + 0.00123){n1 = (double)pop_stackd(pp);n1 = cos(n1);push_stackd(pp, n1);}else if (formed[i] == 'l' + 0.00123){n1 = (double)pop_stackd(pp);n1 = log(n1);push_stackd(pp, n1);}else if (formed[i] == 't' + 0.00123){n1 = (double)pop_stackd(pp);n1 = tan(n1);push_stackd(pp, n1);}else if (formed[i] == ' ' + 0.00123)continue;else if (formed[i] == '\0' + 0.00123)continue;else{push_stackd(pp, formed[i]);}}printf("%lf\n", pp->data[0]);printf("是否继续使用?回车以继续,q键退出:");destroy_stack(p);destroy_stackd(pp);getchar();ch = getchar();if (ch == '\n') continue;else if (ch == 'q') exit(0);system("pause");}
}void push_stack(stack* p, char a)
{if (p->top < (max - 1)){p->data[p->top] = a;p->top++;}elseprintf("进栈错误(d)\n");
}double pop_stack(stack* p)
{if (p->top > 0){p->top--;return p->data[p->top];}elseprintf("出栈错误\n");
}void push_stackd(stackd* p, double a)
{if (p->top < (max - 1)){p->data[p->top] = a;p->top++;}elseprintf("进栈错误\n");
}double pop_stackd(stackd* p)
{if (p->top > 0){p->top--;return p->data[p->top];}elseprintf("出栈错误(d)\n");
}stack* init_stack()
{stack* p;p = Malloc(stack);if (p) p->top = 0;return p;
}stackd* init_stackd()
{stackd* pp;pp = Malloc(stackd);if (pp) pp->top = 0;return pp;
}void destroy_stack(stack* s)
{if (s) free(s);s = NULL;
}void destroy_stackd(stackd* s)
{if (s) free(s);s = NULL;
}double cal(int* arr, int flag)
{double num = 0;int i = 0;int j = 0;for (i = 0; i < flag; i++){if (arr[i] == '.')break;}for (j = 0; j < flag; j++){if (arr[j] != '.')num = num + (arr[j] * pow(10, --i));}return num;
}

C语言顺序栈实现计算器:可以计算小数和数的平方等等相关推荐

  1. 停车场管理系统(C语言顺序栈+链栈+链队列)

    一.实验目的 1.根据停车场管理系统的要求,利用结构化程序设计方法以及C的编程思想来完成系统的设计,使用数据结构中的栈.队列进行分析: 2.按功能定义函数或书写多个文件,进行模块化设计,各个功能模块用 ...

  2. c语言二进制转换算法栈,用C语言顺序栈实现十进制和二进制的转换

    用C语言顺序栈实现十进制和二进制的转换 #include #include #include #define M 100 typedef int datatype; typedef struct{ d ...

  3. 栈的删除函数c语言,顺序栈的插入和删除

    <顺序栈的插入和删除>由会员分享,可在线阅读,更多相关<顺序栈的插入和删除(5页珍藏版)>请在人人文库网上搜索. 1.实验四顺序栈的插入和删除姓名:学号: 日期:一.实验目的: ...

  4. c语言顺序栈完整程序,顺序栈的基本操作(C语言)

    由于现在只学了C语言所以就写这个C语言版的栈的基本操作 这里说一下 :网上和书上都有这种写法 int InitStack(SqStack &p) &p是取地址  但是这种用法好像C并不 ...

  5. C语言——顺序栈(Stack)

    定义:栈是限定仅在表尾进行插入或者删除操作的线性表.因此对栈来说,尾端有其特殊含义,称为栈顶(top),相应的表头端称为栈底(bottom).不含元素的空表称为空栈. 栈的特性:栈又称为先进后出的线性 ...

  6. C语言顺序栈实现代码

    顺序栈 :它是顺序表的一种,具有顺序表同样的存储结构,由数组定义,配合用数组下标表示的栈顶指针top(相对指针)完成各种操作. sqstack.h  //顺序栈头文件(在内存中分配一段连续的存储空间存 ...

  7. 顺序栈十进制转八进制C语言,顺序栈实现十进制跟八进制之间的转换

    顺序栈实现十进制和八进制之间的转换 顺序栈实现十进制和八进制之间的转换 (1)首先实现栈的初始化,既申请固定大小的数组空间,存储数据,用到的方法是 int InitStack(  struct  sq ...

  8. C语言顺序栈简单实现

    代码实现: /*顺序栈:实现接口:创建栈判栈空判栈满返回栈顶元素入栈出栈 */ #include <stdio.h> #include <stdlib.h>#define ST ...

  9. c语言用栈编写计算器程序,用c语言实现简易的计算器四则运算的代码最好用栈方法实现,该怎么解决...

    C/C++ code/*--------------------------------------- 函数型计算器(VC++6.0,Win32 Console)程序由 yu_hua 于2007-07 ...

  10. 判断字符串是否为回文(C语言 顺序栈)

    首先我们需要确定思路,如何用栈来判断字符串是否为回文. 1.栈是先进后出 2.回文是指正读反读均相同的字符序列 从这两点很容易就可以联想到一个方法,我们先将字符串全部存进去栈中,再将它全部出栈,进行对 ...

最新文章

  1. 非线性滤波(opencv)
  2. 网站访问慢解决思路详细图解
  3. Docker桌面不再对企业用户免费,每月订阅费最高21美元,用户直接炸锅了
  4. 为什么放弃治疗_百度百科
  5. WPF ListView DoubleClick
  6. MATLAB从入门到精通-如何在MATLAB中实现各种特殊上标?
  7. linux误删表空间文件,UNDO表空间下的数据文件被误删除后的处理方法
  8. 百度高级Java三面题目!涵盖JVM +Java锁+分布式等
  9. 关于Arcgis工作空间的记忆点
  10. Jquery - jquery 插件,jQuery.Switchable
  11. java.io.File 的一些记录
  12. PowerDesign介绍与使用
  13. linux u盘 修复工具,在Linux终端中修复U盘驱动器问题
  14. 区块链中的epoch
  15. i9级E52450处理器_2019年度十款热门处理器横评 一场没有硝烟的PK
  16. HBuilder安装教程
  17. 用HTML写一首诗并配上图片,需要满足诗的格式
  18. 20230123英语学习
  19. 多图详解Windows恶意软件删除工具的常用操作
  20. “超融合”元年,你准备好了吗?

热门文章

  1. 将TPC-DS数据加载到MariaDB中
  2. java库函数-----List(每日一更)
  3. 如何使用python视频_如何用python播放视频
  4. 大学生应该做的(转自http://blog.readnovel.com/user/707574.html)
  5. 4 月 21 日,Women techMakers,相约上海
  6. Coggle 30 Days of ML(21年11月)-- linux 基础使用
  7. 如何查看攻击服务器的IP?查看攻击IP命令是什么?
  8. 学习网络营销知识应该怎么做?
  9. 云原生之使用Docker部署RSS阅读器Huntly
  10. 美国黄金公司Schiff Gold:BCH避险潜力远大于BCE