IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 中缀表达式到逆波兰表达式并计算结果(c语言版) -> 正文阅读

[C++知识库]中缀表达式到逆波兰表达式并计算结果(c语言版)

中缀表达式到逆波兰表达式并计算结果(c语言版)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include "括号匹配.h"

//处理表达式相关代码

typedef struct BKNode
{
	char data;
	struct BKNode* next;
}BKNode,*BKStack;


typedef struct DTNode
{
	int data;
	struct DTNode* next;
}DTNode,*DTStack;



bool Init_TwoStack(BKStack &B,DTStack &D) 
{
	B = (BKNode*)malloc(sizeof(BKNode));
	D = (DTNode*)malloc(sizeof(DTNode));
	B->next = NULL;
	D->next = NULL;
	if (B == NULL || D == NULL) 
	{
		return false;
	}
	return true;
}


bool IsEmpty_BKStack(BKStack B)
{
	return B->next == NULL;
}


bool IsEmpty_DTStack(DTStack D)
{
	return D->next == NULL;
}

bool Push_BKStack(BKStack &B,char c)
{
	BKNode* node = (BKNode*)malloc(sizeof(BKNode));
	if (node == NULL) 
	{
		return false;
	}
	node->data = c;
	node->next = B->next;
	B->next = node;
	return true;
}

bool Push_DTStack(DTStack &D, int c)
{
	DTNode* node = (DTNode*)malloc(sizeof(DTNode));
	if (node == NULL)
	{
		return false;
	}
	node->data = c;
	node->next = D->next;
	D->next = node;
	return true;
}

bool Pop_BKStack(BKStack &B,char &e)
{
	if (IsEmpty_BKStack(B)) 
	{
		return false;
	}
	BKNode* n = B->next;
	e = n->data;
	B->next = n->next;
	free(n);
	return true;
}


bool Pop_DTStack(DTStack &D, int &e)
{
	if (IsEmpty_DTStack(D))
	{
		return false;
	}
	DTNode* n = D->next;
	e = n->data;
	D->next = n->next;
	free(n);
	return true;
}

bool GetTop_BKStack(BKStack B,char &e) 
{
	if (IsEmpty_BKStack(B)) 
	{
		return false;
	}
	e = B->next->data;
	return true;
}


bool GetTop_DTStack(DTStack D, char &e)
{
	if (IsEmpty_DTStack(D))
	{
		return false;
	}
	e = D->next->data;
	return true;
}


bool IsOperator(char c) 
{
	return ((c == '+') || (c == '-') || (c == '*') || (c == '/'));
}

bool IsBlacket(char c) 
{
	return ((c == '(') || (c == ')'));
}

bool IsNumber(char c) 
{
	return (!IsOperator(c) && !IsBlacket(c));
}



int SimpleCalc(char c, int num1, int num2)
{
	int result;
	switch (c)
	{
	case '+':
		result = num1 + num2;
		break;
	case '-':
		result = num1 - num2;
		break;
	case '*':
		result = num1 * num2;
		break;
	case '/':
		result = num1 / num2;
		break;
	}
	return result;
}


void Calc(DTStack &D,char c) 
{
	int num1;
	int num2;
	Pop_DTStack(D, num2);
	Pop_DTStack(D, num1);

	int result= SimpleCalc(c, num1, num2);

	Push_DTStack(D, result);
}


bool ConvertCharSToNum(char* str, int i, int len, int &re)
{
	char nums[9];
	int offset = 0;
	bool flag = false;
	while (IsNumber(str[i + offset]))
	{
		if (i - 1 >= 0)
		{
			if (IsNumber(str[i - 1]))
			{
				flag = false;
				break;
			}
		}
		if (i + offset >= len)
		{
			break;
		}
		nums[offset] = str[i + offset];
		flag = true;
		offset++;
	}
	if (flag)
	{
		re = strtol(nums, NULL, 10);
		return true;
	}

	return false;
}


int Compute(char* str,int len) 
{
	BKStack B;
	DTStack D;
	Init_TwoStack(B, D);

	
	
	for (int i = 0; i < len; i++)
	{
		char c = str[i];
		if (IsNumber(c)) 
		{
			int num;
			if (ConvertCharSToNum(str, i, len, num)) 
			{
				printf("%d\t", num);
				Push_DTStack(D, num);
			}
			
		}

		if (IsOperator(c)) 
		{
			char opb;
			if (!GetTop_BKStack(B,opb)) 
			{
				Push_BKStack(B, c);
			}
			else
			{
				
				while (false == ((opb == '+' || opb == '-') && (c == '/' || c == '*')))
				{
					if (opb == '(') 
					{
						break;
					}

					bool popSuc= Pop_BKStack(B, opb);
					if (!popSuc)
					{
						break;
					}

					//cal
					Calc(D, opb);
					if (!GetTop_BKStack(B, opb)) 
					{
						opb = NULL;
					}
				}
				
				Push_BKStack(B, c);
				
			}

		}

		if (IsBlacket(c)) 
		{
			if (c == '(') 
			{
				Push_BKStack(B, c);
			}
			else
			{
				
				while (true)
				{
					char kh;
					Pop_BKStack(B, kh);
					if (kh == '(')
					{
						break;
					}
					//cal
					Calc(D, kh);
					
				}
				
				
				
			}
			
		}

	}


	char cl;
	while (Pop_BKStack(B,cl))
	{
		Calc(D, cl);
	}

	int result;
	Pop_DTStack(D, result);
	return result;
}


void testStrtol(char* str,int len) 
{
	for (int i = 0; i < len; i++)
	{
		int re;
		if (ConvertCharSToNum(str, i, len, re)) 
		{
			printf("%d\n", re);
		}
	}
}



int main() 
{
	printf("Input your Expression:\n");
	char str[300] ; //= "31*2+((778+322)/5+100)*2"  //=2*(5+5)+31*(2-1)+((778+322)/5+100)*2
	scanf_s("%s", str,300);
	int len = strlen(str);
	if (!BracketsMatch(str, len)) 
	{
		printf("brackets not match!!\n");
		return -1;
	}
	else
	{
		printf("brackets match success :)\n");
	}
	
	//testStrtol(str, len);
	int re= Compute(str, len);
	printf("\n");
	printf("result is: %d", re);
	return 0;
}
#include<stdio.h>
#include<stdlib.h>

#define MaxSize 100

![在这里插入图片描述](https://img-blog.csdnimg.cn/e3c649d2fb254850a90d1a1c3cfa27b9.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAaGFpcmVuYWE=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
//匹配括号相关代码

typedef struct 
{
	char data[MaxSize];
	int top;
}  Sq1Stack;


bool Init_Sq1Stack(Sq1Stack &S) 
{
	S.top = -1;
	return true;
}


bool IsEmpty_Sq1Stack(Sq1Stack S) 
{
	return S.top ==-1;
}


bool Push_Sq1Stack(Sq1Stack &S,char c) 
{
	if (S.top >= MaxSize-1) 
	{
		return false;
	}
	S.data[++S.top] = c;
	return true;
}


bool Pop_Sq1Stack(Sq1Stack &S,char &c) 
{
	if (IsEmpty_Sq1Stack(S)) 
	{
		return false;
	}

	c = S.data[S.top--];
	return true;
}




//
//int test() 
//{
//	Sq1Stack S;
//	Init_Sq1Stack(S);
//	for (int i = 0; i < 10; i++)
//	{
//		Push_SqStack(S, i);
//	}
//
//	int e=-1;
//	while (Pop_Sq1Stack(S,e))
//	{
//		printf("%d\t", e);
//		e = -1;
//	}
//	printf("\n");
//
//	return 0;
//
//}
//


bool BracketsMatch(char* str,int len) 
{
	Sq1Stack S;
	Init_Sq1Stack(S);



	for (int i = 0; i < len; i++)
	{
	

		char s = str[i];
		if (s=='('||s=='['||s=='{')
		{
			Push_Sq1Stack(S, s);
		}
		else if(s==')'||s==']'||s=='}')
		{
			if (IsEmpty_Sq1Stack(S)) 
			{
				return false;
			}

			char c;
			Pop_Sq1Stack(S, c);
			if ((s == ')'&& c != '(') || (s == ']'&&c != '[') || (s == '}'&&c != '{'))
			{
				return false;
			}
			
			
			
		}

	}

	return IsEmpty_Sq1Stack(S);
}


int main_BlacketMatch() 
{
	char str[] = "((){}{}[{{}}()(]()))";  //
	int len = sizeof(str) / sizeof(str[0])-1; //尾部有\0多一个字符
	bool b = BracketsMatch(str,len);
	if (b)
		printf("%s", "match success!!");
	else
		printf("%s", "match failed!!");
	return 0;
}

最终结果

在这里插入图片描述

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-01 23:08:08  更:2022-04-01 23:09:32 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:25:52-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码