用栈实现中缀转后缀(c++)

本文介绍了如何使用栈来实现中缀表达式到后缀表达式的转换。程序通过限定表达式为数字0-9和运算符±*/()简化问题,并详细阐述了转换过程:数字直接输出,遇到*/入栈,遇到±则检查栈是否为空或有左括号,遇到右括号则不断出栈直到遇到左括号。代码中定义了顺序栈结构,并提供了初始化、入栈、出栈的函数。最后,提供了一个完整的中缀表达式转换示例。
摘要由CSDN通过智能技术生成

用栈实现表达式中缀转后缀

栈的特点是先进后出,可以用来将中缀表达式转换成后缀表达式,在本程序中对表达式进行了限制,数字0-9,运算符只有±*/(),缩小了问题规模。

转换思路:将表达式输入,全部数据以char型存储在vector容器中,输入完后从左到右扫描vector,遇到数字直接输出,遇到操作符时根据操作符的种类分为三种情况进行操作:

1.遇到*/和( 时直接入栈,乘除运算级别最高,所以应该直接入栈,左括号也直接入栈,直到遇到右括号才出栈。

2.遇到±时,若栈中无元素,则直接入栈,否则开始出栈直到遇到左括号或者栈,再入栈。

3.遇到右括号开始出栈,知道遇到 左括号,其中左括号不输出。

结点的定义

typedef struct //顺序栈的结构定义 
{
	char *base;
	char *top;
	int stacksize;
 }SqStack;
 

代码实现如下
下面展示一些 内联代码片

#include <iostream>
#include<vector>
using namespace std;

#define MAXSIZE 100

typedef struct //顺序栈的结构定义 
{
	char *base;
	char *top;
	int stacksize;
 }SqStack;
 
 void InitStack(SqStack &S)//初始化 
 {
 	S.base = new char[100];
    if (!S.base) 
	{
		
	    cout << "内存空间不足" << endl;	
	    exit(1); //空间不足 退出 
    }
	
	S.top = S.base;
	S.stacksize = MAXSIZE;
}


void Push(SqStack &S, char e) //入栈 
{
	if (S.top - S.base == S.stacksize) 
	{
		cout << "栈已满" << endl;
		exit(1);
	}
	
	*S.top = e;
	*S.top++;

}


void Pop(SqStack &S, char &e) //出栈并返回栈顶元素 
{
	if (S.top == S.base ) 
	{
		cout << "栈已空" << endl;
		exit(1);
	}
	
	*S.top--;
	e = *S.top;
}


 
 
 
 int main()
 {
 	char e;    //e用来暂时存出栈的元素
 	SqStack Result;
 	vector<char> data; //储存表达式的容器
    char mydata; 
 	  
    void InitStack(SqStack &S); //初始化栈
    void Push(SqStack &S, char e); //压栈
    void Pop(SqStack &S,char &e); //出栈
    
    
    InitStack(Result);
    cout << "输入中缀表达式,以CTRL + Z结束" << endl; 
    
	while (cin >> mydata)  //输入表达式,以CTRL+Z结束。
		data.push_back(mydata); //vector容器,在尾端添加元素的方法
    
    //下面开始从左到右依次扫描data数组;
	
	for (int i = 0; i < data.size(); i++ )   //从左到右开始扫描整个中缀表达式 
	{
		
		if (data[i] >= '0' && data[i] <= '9') //数字直接输出 
		cout << data[i] << " ";
		
		
		else if(data[i]=='*'||data[i]=='/'||data[i]=='(') //最简单的情况 */( 直接入栈 
		{
			Push(Result, data[i]);
		}
		
		
		
		else if(data[i] == '+' || data[i] == '-')
		{
			if( Result.base == Result.top )//如果栈空,则直接将+-压入栈里 
			{
				Push(Result, data[i]);
			}
			
			else
			{
				
				do
				{
					Pop(Result, e);
					if(e == '(')
					{
						Push(Result,e);
					}
					else
					{
						cout << e;
					}
				}while( Result.base != Result.top && e != '(' );
				
				Push(Result,data[i]);
			}
				
		}
		 
		else if ( data[i] == ')')
		{
			Pop(Result,e);
			
			while(e!='(')
			{
				cout << e << " ";
				Pop(Result,e);
			}
		}
		else cout <<"ERROR"; 

	}
	while(Result.base != Result.top)
		{
		Pop(Result, e);
		cout <<e << " ";
		}
		
	return 0;
	
	
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值