顺序栈的简单实现以及利用栈实现求解一位数的复合运算

《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;
	  
        }
	
};


2、中缀转后缀:



判断是否位操作符:

bool isdigit(char f)
{
   switch(f)
   {
   case'(':
   case'*':
   case'/':
   case'%':
   case'+':
   case'-':
   case'@':
   case'#':
   case')':return false;break;
   default:return true;break;
   }

}

主函数:



总结与感悟:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值