func.cpp
#include<iostream>
#include "head.h"
#include "postfix.h"
#include "Dstack.h"
using namespace std;
void main()
{
string infixEXP;
// cout<<"note:enter # for infix expression to stop"<<endl;
cout<<"中缀表达式为:";
getline(cin,infixEXP);
string c=postfix(infixEXP);
cout<<"后缀表达式为:"<<postfix(infixEXP)<<endl;
Tnode *root;
int deep;
root=creatTree(c);
deep=depth(root);
print(root,deep);
cout<<endl;
}
/*
#include<iostream>
#include "Dstack.h"
using namespace std;
int main()
{
stack<int> s;
s.push(1);
return 0;
}
*/postfix.h头文件#include<iostream>
#include<string>
#include<cctype>
using namespace std;
#include "Dstack.h"
string postfix(string exp)
{
char token;//exp中的字符
string s;
stack<char>opstack;
string postfixExp;
for(int i=0;i<exp.length();i++)
{
token=(char)exp[i];
switch(token)
{
case' ':
break;
case'(':
opstack.push(token);
break;
case')':
while(opstack.top()!='(')//不到(的时候一直弹出
{
s=opstack.top();
postfixExp.append(s);
opstack.pop();
}
opstack.pop();
break;
case'+':
case'-':
case'*':
case'/':
case'%':
if(opstack.empty()|| opstack.top()=='('||(token=='*'||token=='/'||token=='%')&&(opstack.top()=='+'||opstack.top()=='-'))
{
opstack.push(token);
}
else
{
s=opstack.top();
postfixExp.append(s);
opstack.pop();
if(opstack.top()=='+'||opstack.top()=='-')
{
s=opstack.top();
postfixExp.append(s);
opstack.pop();
}
opstack.push(token);
}
break;
default:
s=token;
postfixExp.append(s);
break;
}
}
while(!opstack.empty())
{
s=opstack.top();
postfixExp.append(s);
opstack.pop();
}
return postfixExp;
}
Dstack.h头文件
#include<iostream>
#include<string.h>
using namespace std;
#define MaxSize 200
#ifndef Dstack
#define Dstack
template<typename T>
class stack{
private:
int ttop;
T array[200];
public:
stack();
void push(const T &value);
void pop();
bool empty() const;
T& top(void);
int size();
};
template<typename T>
stack<T>::stack()
{
ttop=-1;
}
template<typename T>
void stack<T>::push(const T & value)
{
if(ttop<MaxSize-1)
{
++ttop;
array[ttop]=value;
}
}
template<typename T>
bool stack<T>::empty() const
{
return (ttop==-1);
}
template<typename T>
T& stack<T>::top(void)
{
return(array[ttop]);
}
template<typename T>
void stack<T>::pop()
{
if(!empty())
ttop--;
else
cout<<"the stack is empty";
}
template<typename T>
int stack<T>::size()
{
return ttop+1;
}
#endif
head.h头文件#include<iostream>#include<string>
#include "Dstack.h"
#include<iomanip>
using namespace std;
class Tnode
{
public:
char oper;
Tnode *left;
Tnode *right;
Tnode(){}
Tnode(char item)
{
oper=item;
left=NULL;
right=NULL;
}
};
/*void postOrder(Tnode *p)
{
if(p)
{
postOrder(p->left);
postOrder(p->right);
cout<<p->oper;
}
}*/
bool isOper(char item)//判断是否为运算符
{
char oper[]={'(',')','+','-','*','/','^','%'};
for(int i=0;i<sizeof(oper);i++)
{
if(item==oper[i])
{
return true;
}
}
return false;
}
Tnode* creatTree(string &str)
{
stack<Tnode*> nodestack;
Tnode *p;
char temp;
int i=0;
temp=str[i++];
while(temp!='\0')
{
if(!isOper(temp))
{
p=new Tnode(temp);
nodestack.push(p);
temp=str[i++];
}
else
{
p=new Tnode(temp);
if(!nodestack.empty())
{
p->right=nodestack.top();
nodestack.pop();
}
if(!nodestack.empty())
{
p->left=nodestack.top();
nodestack.pop();
}
nodestack.push(p);
temp=str[i++];
}
}
return p;
}
// template<typename T>
void print(Tnode *node_ptr,int depth)
{
if (node_ptr!= NULL)
{
print(node_ptr->right,depth+1);
cout << setw(4*depth) << " ";
cout << node_ptr->oper << endl;
print(node_ptr->left, depth+1);
}
}
// template<typename T>
int depth(Tnode *t)
{
int depthval,depthright,depthleft;
if(t==NULL)
return -1;
else
{
depthleft=depth(t->left);
depthright=depth(t->right);
depthval=1+(depthleft>depthright?depthleft:depthright);
}
return depthval;
}
1415

被折叠的 条评论
为什么被折叠?



