#include<iostream>
#include<cstdio>
#include<stdlib.h>
#include<string>
using namespace std;
//15级软件10赵海宏思考的算法
//中途的链表算法是从我的另一个代码中抠出来的,所以有冗余代码,不好意思呀^_^
struct LinkNode
{char x;LinkNode*next;//链表中的数据是int类型的,此表示下一个链表节点
};
class List
{
private:LinkNode*Head;//表示链表的初指针(不是头指针),Head节点x为0int ListSize;//表示链表除了head指向节点的总长度
public:List();virtual~List() {};void Insert(int y, int n);//分别在当前节点后,表头,表尾插入值为x的节点;void Delete(int y);//删除表头,表尾,和当前节点的后继节点,0表示删除表头元素;int back(int k);//返回第k个节点的值int Find(int k);//查找值为k的元素在单链表中出现的位置int backsize() { return ListSize; }void Show();//链表输出函数bool pd_match_zhh();//判断链表储存的算数表达式是否正确匹配
};int main()
{List A;A.Show();if (A.pd_match_zhh()) { cout << "正确" << endl; }else { cout << "错误" << endl; }system("pause");return 0;
}/*算法思路:用一个长度为7的数组,分别用arr[1],arr[2],arr[3],arr[4],arr[5],arr[6]
表示{ ,【 ,( ,} ,】 ),对他们的数值进行判断,当arr【1】=arr【2】的时候,如果
说arr[3]和arr【2】都不为0的话,那么说明当{}能够顺序匹配完成的时候,在}之前没有】和)
能够匹配(,【此时说明,算术表达错误,而如果不存在这种情况那么则将表示{ ,}的数组的
值清零进行下一次匹配即可
*/
//以上是初步的一次判断形式想法
bool List::pd_match_zhh()
{LinkNode*temp = Head;int arr[7] = {0};//用1-6表示六个不同符号所含有的总个数while ( (temp->next) != NULL){temp = temp->next;char a;a = temp->x;switch (a){case'{':arr[1]++;break;case'[':arr[2]++;break;case'(':arr[3]++;cout << arr[3] << endl;break;case'}':arr[4]++;break;case']':arr[5]++;break;case')':arr[6]++;cout << arr[6] << endl;break;default:break;}if ( ((arr[1] == arr[4])&&arr[1]>0)||( (arr[1]>arr[4])&&arr[4]!=0) )//要考虑一开始arr都为0的时候的情况,此时是没有匹配的{if (arr[2]!=0 || arr[3] != 0) { return false; }//如果已经匹配了{},而(和【还没有匹配上那么算术表达式错误arr[1]--;arr[4]--;}if(arr[4]>arr[1]) { return false; }if (((arr[2] == arr[5]) && arr[2]>0) || ( (arr[2]>arr[5]) && arr[5] != 0)){if (arr[3] != 0) { return false; }arr[2]--;arr[5]--;}if (arr[5]>arr[2]) { return false; }if(((arr[3] == arr[6]) && arr[3]>0) || ( (arr[3]>arr[6]) && arr[6] > 0)){arr[3]--;arr[6]--;cout << "断点1" << endl;system("pause");}if (arr[6]>arr[3]) { cout <<arr[6]<<'\t'<<arr[3]<< "断点2" << endl;return false; }}cout << "断点3" << endl;return true;
};List::List()//链表的构造函数
{int n;Head = new LinkNode;//建立一个链头指针(不是第一个有意义的节点)string a;cout << "请输入算数表达式:";cin >> a;//读入这个字符串n = a.size();ListSize = 0;//最开始节点的个数为0Head->next = NULL;//在没有节点的时候Head链接的下一个地址应该为NULL(空)LinkNode*temp = Head;(*Head).x = 0;//Head的节点的x值认为他是0即可if (n != 0){for (int i = 1;i <= n;i++){LinkNode*Lnext = new LinkNode;//建立新的节点//cout << "请输入您要赋予新节点的值x:";//cin >> (*Lnext).x;//对x进行赋值(*Lnext).x = a[i-1];//将字符串的第i个值赋值给新建立的节点temp->next = Lnext;ListSize = ListSize + 1;//节点的数量进行加一处理temp = Lnext;//temp的地址值往下移动}temp->next = NULL;//将最后一个节点的地址值置空cout << "表中的出head的节点个数为:" << ListSize << endl;}else { cout << "表中只有Head节点,节点个数为0" << endl; }}void List::Insert(int y, int n)//y表示在那个位置插入为值n的节点,分别在当前节点后,表头,表尾插入值为x的节点;
{LinkNode*temp = Head;for (int i = 1;i <= y;i++){temp = temp->next;}//找到第y个位置LinkNode* Lnext = new LinkNode;//创建一个新节点准备插入;(*Lnext).x = n;if (y == 0)//在Head和第一个节点之间插入(即在表头插入){LinkNode*link;link = temp->next;Lnext->next = link;temp->next = Lnext;ListSize++;}//表头插入完成else if (y == ListSize)//在表尾部进行插入{Lnext->next = NULL;temp->next = Lnext;//在表尾插入完成ListSize++;}else//在中间进行插入{LinkNode*link;link = temp->next;Lnext->next = link;temp->next = Lnext;ListSize++;}cout << "链表插入完成" << endl;
};
void List::Show()
{LinkNode*temp = Head;cout << "链表的节点个数:" << ListSize << endl;if (ListSize == 0) { cout << "链表为空" << endl;return; }for (int i = 1;i <= ListSize;i++)//不会出现temp的地址值为NULL{//if (temp->next != NULL)//{temp = temp->next;cout <<  (temp->x) ;//}//else { break; }}cout << endl;return;
};//链表输出函数void List::Delete(int y)//可以进行删除节点的操作
{LinkNode*temp = Head;if (y == 0)//删除表头元素{LinkNode*link;link = temp->next->next;temp->next = link;//进行删除操作ListSize--;}else if (y == ListSize)//删除表尾的元素{for (int i = 1;i <= y - 1;i++)//找到表尾的前一个元素{temp = temp->next;}temp->next = NULL;//直接对尾节点的前一个节点置空ListSize--;}else{for (int i = 1;i <= y;i++){temp = temp->next;}temp->next = temp->next->next;ListSize--;}return;
};int List::back(int k)
{LinkNode*temp = Head;if (k > ListSize || k <= 0) { cout << "输入不合法或超出链表的存储范围" << endl;return -1; }for (int i = 1;i <= k;i++){temp = temp->next;}return temp->x;
};int List::Find(int k)
{int find = -1;//-1如果没有更改说明没有找到位置int ji = 0;LinkNode*temp = Head;while (temp != NULL){temp = temp->next;ji++;if ((temp->x) == k) { find = ji;return find; }}if (find == -1) { cout << "没有找到该位置" << endl; }return find;
}

基于C++的采用单链表判断算术表达式的合理性相关推荐

  1. TypeScript算法专题 - blog1.基于TypeScript语言的单链表实现

    TypeScript算法专题 - 基于TypeScript语言的单链表实现 李俊才 CSDN:jcLee95 邮箱:291148484@163.com 专题目录:https://blog.csdn.n ...

  2. 通讯录中每个通讯者的信息包括编号、姓名、性别、电话、E-mail地址;采用单链表结构存储

    通讯录中每个通讯者的信息包括编号.姓名.性别.电话.E-mail地址:采用单链表结构存储,实现以下功能: 1.通讯录的建立 2.通讯者信息的插入 3.通讯者信息的查询 4.通讯者信息的删除 5.通讯录 ...

  3. 单链表-判断单链表L是否是递增的(双指针法)

    单链表的存储结构: typedef struct LinkList{ int data; LinkList * next; } 分析: 定义一个指针p够不够用? 你要判断是否递增,说明要比较前后两节点 ...

  4. 单链表——判断一个单链表中是否有环

    2019独角兽企业重金招聘Python工程师标准>>> package jxau.lyx.link;/*** * @author: liyixiang* @data:2014-10- ...

  5. 单链表——判断两个单链表(无头节点)是否相交,如果相交,返回单链表的第一个结点

    本博客主要记录两个解法: 1.求两个单链表的节点个数,消除结点个数不同带来的影响,两个指针一起走,相遇即相交点. 2.数学方式求解. 一.求结点个数,消除结点个数不同带来的影响,俩指针同步走 思路:两 ...

  6. 简易个人信息登记系统(基于广义表,单链表)

    2019-2020 数据结构课程设计 一.需求分析 1)基本需求 1.记录个人信息 2.使用适当的数据结构储存个人信息 3.个人信息包括姓名,身份证号码,出生日期(包括年,月,日),兴趣 爱好(包括兴 ...

  7. 编译原理实验--实验二 递归下降法判断算术表达式的正确性--Python实现

    目录 一.实验目的和要求 二.实验内容 三.实验环境 四.实验步骤 1.语法分析所依据的文法: 2.给出消除左递归及提取左公因子的文法: 五.测试要求 六.实验步骤 1.语法分析所依据的文法 2.给出 ...

  8. 单链表的快速排序(转)

    2010年11月30日 星期二 15:13 单链表的快速排序和数组的快速排序在基本细想上是一致的,以从小到大来排序单链表为例, 都是选择一个支点,然后把小于支点的元素放到左边,把大于支点的元素放到右边 ...

  9. [数据结构与算法] 单链表的简单demo

    Vc6之下编译通过.. 1 /******************************************************* 2 * @: Project: 单链表数据结构演示 3 * ...

  10. 单链表一元多项式求和java_计算一元多项式的相加

    一元多项式的表达和相加 ​ 使用单链表表示一元多项式,由于使用java语言自己编写实现,没有使用LinkedList集合实现.所以需要创建单链表的类,类中包含指数,系数和后继元素的地址.类的设计如下: ...

最新文章

  1. iOS -- UIApplication
  2. 什么是数据湖(Data Lake)?
  3. python灰度共生矩阵_四:利用python的skimage计算灰度共生矩阵
  4. c++和c语言的区别_C 语言和 C++ 有什么区别?老程序员居然这样理解,不怕你不懂...
  5. 如何在word文档中添加附件
  6. decimal类型 go_Go 语言程序设计——字符串类型(2)
  7. python pytest框架
  8. jar命令 解压/压缩 war、jar文件
  9. Hybird方案-概述
  10. 依赖倒置原则应用-司机开车案例
  11. 经度纬度地图搜索器_百度地图搜索经度纬度_地球经度纬度示意图
  12. 波特率、比特率 与数据传输速率的区别
  13. docker中安装nacos报错 com.alibaba.nacos.shaded.io.grpc.StatusRuntimeException: UNAVAILABLE: io exception
  14. 要求返回三位数中的水仙花数 ,数字范围在100-999中。(水仙花数:百位数的3次方+十位数的3次方+个位数的三次方=数字本身)
  15. jflash烧录教程_Jlink flash 烧录HEX 程序
  16. 局域网IP地址查看软件V2.0使用教程 Python办公自动化
  17. 在EXCEL表格中经常会遇到有合并单元格时,汇总计算的公式无法直接下拉自动填充计算,掌握这个小技巧一键汇总
  18. 从hilinux.com架设谈网站或其他服务器运维
  19. 高德地图在H5页面中的使用(VUE)
  20. java接口编程题_Java接口练习题

热门文章

  1. [UE4] 虚幻4学习---UE4中的字符串转换
  2. 元组 与 字典
  3. 数据库和Content Provider
  4. [软件更新]迅雷v5.9.8.1084发布
  5. [Java基础]StringUtils.join()方法与String.join()方法的使用
  6. mybatis传参总结
  7. js模拟select控件
  8. 一个基于protobuf的极简RPC
  9. 10. 了解分配子(allocateor)的约定和限制
  10. 非酋用计算机弹唱,非酋简谱 薛明媛/朱贺 听说爱情就是这样子