一、栈
1.栈是特殊的线性表,限定仅在表尾进行插入和删除操作的线性表。允许插入和删除的一端称为栈顶,另一端称为栈底。
2.空栈:不含任何数据元素的栈。
3.栈的操作特性:后进先出。但是栈只是对插入和删除操作的位置进行了限制,并没有限定插入和删除操作进行的时间。
4.利用数组实现栈的顺序存储,先要确定用数组的哪一段表示栈底,附设指针top指示栈顶元素在数组中的位置。
进栈:top+1【先判断是否栈满:top=MAX_SIZE-1】
出栈:top-1【先判断是否栈空:top=-1】
5.顺序栈实现
入栈操作:

template <class T>
void  seqStack<T>::Push ( T  x)
{
     if (top==MAX_SIZE-1)  throw  “溢出”;
     top++;
     data[top]=x;
 } 

判断栈是否为空

template <class T>
bool  seqStack<T>::Empty ()
{
     if (top==-1)  
         return true;
     return false;
 } 

取栈顶

template <class T>
T  seqStack<T>::GetTop ( )
{
     if (Empty()) throw  ”空栈” ;
     return data[top];
 } 

出栈

template  <class  T>
T  seqStack<T>:: Pop ( )
{
     if (top==-1)  throw  “溢出”; 
     x=data[top];
      top--;
     return  x;
}

6.双端栈是两个栈共享一个空间
声明:

const int Stack_Size=100;  
template <class T>
class BothStack 
{
  public:
       BothStack( );
       ~BothStack( ); 
       void Push(int i, T x);   
       T Pop(int i);          
       T GetTop(int i);       
       bool Empty(int i);     
  private:
       T data[Stack_Size];     
       int top1, top2;        
};

双端栈栈满的判断条件

top1=top2-1;

链栈使用与顺序栈类似
7.后缀表达式求值

从左到右对后缀表达式字符串进行处理,每次处理一个符号;

若遇到数字,入栈; 若遇到运算符,栈顶两个数字出栈,执行运算符所定义的运算,并将运算结果入栈;

重复以上的工作,直到表达式结束,此时,栈中的数字代表最终的值。

8.中缀表达式求值
设置两个栈: OVS(运算数栈)和OPTR(运算符栈);
自左向右扫描中缀表达式: 遇操作数进OVS, 遇操作符则与OPTR栈顶优先数比较:
OPTR栈顶<当前操作符, 当前操作符进OPTR栈;
OPTR栈顶>=当前操作符,OVS栈顶、次顶和OPTR栈顶,退栈形成运算T(i),T(i)进OVS栈。
中缀表达式转化为后缀表达式
设置一个运算符栈。从左到右依次对中缀表达式中的每个符号进行处理。
如果遇到数字,直接输出;
如果遇到“(”,则将其入栈;
如果遇到运算符a,如果栈顶符号的优先级。
低于a的优先级,则入栈;
否则,栈顶符号出栈,直到栈顶符号的优先级低于a的优先级,此时让a入栈。
若遇到“)”,则栈顶符号出栈,直到“(”;
重复以上工作,直到表达式结束,此时,将栈里符号全部出栈。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值