将中缀表达式转换为后缀表达式
头文件
#pragma once
#include <assert.h>
#include <iostream>
#include<stdlib.h>
using namespace std;
const int stackIncreament = 20; //栈溢出时扩展空间的增量
template <class T>
class SeqStack { //顺序栈类定义
private:
T *elements; //存放栈中元素的栈数组
int top; //栈顶指针
int maxSize; //栈最大容量
void overflowProcess(); //栈的溢出处理
public:
SeqStack(int sz = 50); //建立一个空栈
//~SeqStack() { delete[]elements; } //析构函数
void Push(const T& x); //进栈
bool Pop(T& x); //出栈
bool getTop(T& x); //取栈顶内容
bool IsEmpty() const
{
return (top == -1) ? true : false;
}
bool IsFull() const
{
return (top == maxSize - 1) ? true : false;
}
int getSize() const { return top + 1; }
void MakeEmpty() { top = -1; }//清空栈的内容(注意其与析构函数配合)
int panduan(char ch);
int isp(char ch1);
int icp(char ch2);
void clear();
void Postfis();
void Input();
private:
char*infix;
char*postfix;
};
template<class T>
SeqStack<T>::SeqStack(int sz)
//建立一个最大尺寸为sz的空栈,若分配不成功则错误处理。
{
top = -1;
maxSize = sz;
elements = new T[maxSize]; //创建栈的数组空间
// assert(elements!=NULL); //断言
}
template <class T>
void SeqStack<T>::overflowProcess()
//私有函数:当栈满则执行扩充栈存储空间处理
{
T *newArray = new T[maxSize + stackIncreament]; //创建更大的存储数组
if (newArray == NULL)//assert函数
{
cerr << "存储分配失败!" << endl; exit(1);
}
for (int i = 0; i <= top; i++)
newArray[i] = elements[i];
maxSize = maxSize + stackIncreament;
delete[]elements;
elements = newArray; //改变elements指针
}
template <class T>
void SeqStack<T>::Push(const T& x)
{
if (IsFull() == true) overflowProcess(); //栈满
elements[++top] = x; //栈顶指针先加1, 再进栈
}
template <class T>
bool SeqStack<T>::Pop(T& x)
{
if (IsEmpty() == true) return false;
x = elements[top--]; //先退栈,再栈顶指针退1
return true; //退栈成功
}
template <class T>
bool SeqStack<T>::getTop(T& x) {
//取顺序栈的栈顶元素的值
if (IsEmpty() == true) return false;
x = elements[top];
return true;
}
template<class T>
int SeqStack<T>::panduan(char op)
{
if ((op >= 'a'&&op <= 'z') || (op >= 'A'&&op <= 'Z'))
return true;
else
return false;
}
template <class T>
int SeqStack<T>::isp(char chl)
{
switch (chl)
{
case')':return 6;
case'*':return 5;
case'/':return 5;
case'%':return 5;
case'+':return 3;
case'-':return 3;
case'(':return 1;
case'#':
default:return 0;
}
}
template <class T>
int SeqStack<T>::icp(char ch2)
{
switch (ch2)
{
case'(':return 6;
case'*':return 4;
case'/':return 4;
case'%':return 4;
case'+':return 2;
case'-':return 2;
case')':return 1;
case'#':
default:return 0;
}
}
template <class T>
void SeqStack<T>::Input()
{
infix = new char[20]; cout << "请输入中缀表达式为:" << endl;
cin >> infix;
}
- cpp文件 ,
#include"SeqStack.h"
int main()
{
SeqStack<char>a;
a.Input();
a.Postfis();
}