zoukankan      html  css  js  c++  java
  • 数据结构-四则表达式运算

    //四则运算
    //xxg
    //暂不支持() #pragma once #include<iostream> using namespace std; typedef struct numNode{//数字栈 char data; struct numNode* next; }numNode,*numListStack; typedef struct opNode { char data; struct opNode* next; }opNode,*opListStack; class c17 { private: numListStack pushnum(numListStack num,char data) { numNode* p = new numNode; p->data = data; p->next = num; num = p; return num; } numListStack popnum(numListStack num ,char &numdata) { if (num != NULL) { numdata = num->data; numNode *p = new numNode; p = num; num = num->next; delete p; return num; } } opListStack pushop(opListStack op,char data) { opNode *p = new opNode; p->data = data; p->next = op; op = p; return op; } opListStack popop(opListStack op, char& numdata) { if (op != NULL) { numdata = op->data; opNode* p = new opNode; p = op; op = op->next; delete p; return op; } } int youxianji(char a) { if (a == '+') { return 1; } if (a == '-') { return 2; } if (a == '*') { return 3; } if (a == '/') { return 4; } } int yunsuan(char a, char b, char op) { int zuo = a - '0'; int you = b - '0'; if (op == '+') { return zuo + you; } if (op == '-') { return zuo - you; } if (op == '*') { return zuo * you; } if (op == '/') { return zuo / you; } } public: void main1() { char a[100];/*输入的表达式*/ char a1[100];/*后缀表达式*/ int i = 0,length; numListStack numLS = NULL; opListStack opLS = NULL; cout << "请输入正确且有意义的算术表达式:" << endl; cout << "按#键退出输入" << endl; cout << "请严格按照一个字符一个空格间隔输入,按空格结束" << endl; while (i < 100) { cin >> a[i++]; if (cin.get() == ' ') break; } length = i; for (int i = 0; i < length; i++) { cout << a[i]; } cout << "后缀表达式为:" << endl; int j = 0; coutreoder(opLS, a, length, a1,j); cout << endl << "存储的后缀表达式数组为:" << endl;; for (int k = 0; k < j; k++) { cout << a1[k] <<" "; } cout <<endl<< "计算结果为:" << endl; sum(numLS, a1, j); } //输出后缀表达式 void coutreoder(opListStack op,char arr[],int length,char arr1[],int &j) { for (int i = 0; i < length; i++) {//遍历输入的表达式,数直接输出,运算符压栈比较优先级后输出 if (arr[i] >= '1' && arr[i] <= '9') { cout << arr[i] << " "; arr1[j] = arr[i];/*将数字存入数组*/ j++; }else{ if (op == NULL) {/*操作符栈为空直接压入*/ op = pushop(op, arr[i]); } else { //判断运算符优先级 int a = youxianji(arr[i]);//入栈优先级 int b = youxianji(op->data);//栈内优先级 if (arr[i] == '(') { continue; } if (arr[i] == ')') { continue; } if (arr[i] == '#') {/*遇到#全部弹出*/ while (op != NULL) { char data; op = popop(op, data); arr1[j] = data; j++; cout << data; } } else { while (a <= b) {/*直到遇到优先级比较低的否则全部弹出*/ char data; op = popop(op, data); arr1[j] = data; j++; cout << data; a = youxianji(arr[i]);//入栈优先级 if(op!=NULL)/*空栈直接退出*/ b = youxianji(op->data);//栈内优先级 else { break; } } /*直接压入*/ op = pushop(op, arr[i]); } } } } } //计算结果 void sum(numListStack num, char arr[], int length) { int data; arr[length] = '#'; for (int i = 0; i < length+1; i++) { if (arr[i]>='0'&&arr[i]<='9') { num = pushnum(num, arr[i]); continue; } if (arr[i] == '#') { char data3; num = popnum(num, data3); data = data3 - '0'; } else { char a; char b; num = popnum(num, a); num = popnum(num, b); char sum = yunsuan(b, a, arr[i]) + '0'; num = pushnum(num, sum); } } cout << data << endl;; } };

      

  • 相关阅读:
    gulp使用技巧-删除node_modules文件夹,解决目录层次太深删除报错的问题
    PHP学习-链接数据库
    教程笔记《JavaScript深入浅出》
    读书笔记《高性能网站建设指南》之雅虎军规
    CSS3边框图片-像素虚边的问题
    WebStorm设置手机测试服务器-局域网内其他设备访问
    gulp的安装和使用
    H5canvas赛车游戏-基于lufylegend引擎
    WebStorm设置左侧菜单栏背景色和样式
    基于jquery的-获取短信验证码-倒计时
  • 原文地址:https://www.cnblogs.com/sakura-xxg/p/14953452.html
Copyright © 2011-2022 走看看