《1、》理论准备:
step1. 运算优先级:
| # | @ | ‘*’ ’/’ ‘%’ | ‘+’ ‘-’ | ( | ) |
ISP(栈內优先数) | 0 | 0 | 5 | 3 | 1 | 6 |
ICP(栈外优先数) | 0 | 0 | 4 | 2 | 6 | 1 |
int isp(char f)
{
switch(f)
{
case'@':
case'#':return 0;break;
case'(':return 1;break;
case'*':
case'/':
case'%':return 5;break;
case'+':
case'-':return 3;break;
case')':return 6;break;
}
}
int icp(char f)
{
switch(f)
{
case'@':
case'#':return 0;break;
case'(':return 6;break;
case'*':
case'/':
case'%':return 4;break;
case'+':
case'-':return 2;break;
case')':return 1;break;
}
}
step2.中缀表达式转换成后缀表达式:
中缀:A+B*(C-D)-E/F
后缀:ABCD - * +EF/-
先将中缀表达式逆序压入栈中;
按照以下规则出栈:
icp(ch) > isp(op) , ch进栈,读取下一个
icp(ch) < isp(op), 退栈输出
icp(ch) == isp(op),退栈不输出,读下一个;
即可得到后缀表达式。
step3.计算:
先将后缀表达式按顺序遍历,如果是操作数则压入栈中,如果是操作符则取出两个操作数出栈,进行运算并将其结果压入栈中......直到栈为空。
1、栈的简单构造:
#ifndef _SEQSTACK_H
#define _SEQSTACK_H
#include<assert.h>
#include<iostream>
using namespace std;
template<class Type>
class Stack
{
private:
enum{STACK_DEFAULT_SIZE = 20};
Type *base;
size_t capacity;
size_t top;
public:
Stack(size_t sz = STACK_DEFAULT_SIZE)
{
capacity = sz > STACK_DEFAULT_SIZE? sz :STACK_DEFAULT_SIZE;
base = new Type[capacity] ;
top = 0;
}
~Stack()
{
delete []base;
base = NULL;
capacity = top = 0;
}
public:
bool isfull()const
{return top >= capacity?true:false;}
bool isempty()const
{return top == 0?true:false;}
public:
void push( Type x)
{
if(!isfull())
{
base[top++] = x;
//top++;
}
}
void pop()
{
if(!isempty())
{
top--;
}
}
Type gettop()
{
if(!isempty())
{
return base[top-1];
}
}
void clear_stack()
{top = 0;}
size_t lenth()const
{return top;}
void show_stack()const
{
int i;
for(i = top-1;i>= 0;i--)
{
cout<<base[i]<<" | ";
}
cout<<endl;
}
};
判断是否位操作符:
bool isdigit(char f)
{
switch(f)
{
case'(':
case'*':
case'/':
case'%':
case'+':
case'-':
case'@':
case'#':
case')':return false;break;
default:return true;break;
}
}
主函数:
总结与感悟: