用栈实现表达式中缀转后缀
栈的特点是先进后出,可以用来将中缀表达式转换成后缀表达式,在本程序中对表达式进行了限制,数字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;
}