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;; } };

      

  • 相关阅读:
    从亚马逊、微软、谷歌的云之争,看国内云计算的未来
    即使是菜鸟,也能配置出一个网站
    为什么软件开发周期通常是预期的两三倍?
    2015-2016前端知识体系
    UOJ269【清华集训2016】如何优雅地求和【数论,多项式】
    LOJ166 拉格朗日插值 2【卷积,NTT】
    CF1140F Extending Set of Points 【按时间分治,并查集】
    CF1168C And Reachability 【构造,dp】
    CF1182F Maximum Sine【类欧,扩欧】
    牛客 可见山峰对数量(进阶)
  • 原文地址:https://www.cnblogs.com/sakura-xxg/p/14953452.html
Copyright © 2011-2022 走看看