C++栈

只能从一端访问的线性群体

特点:先进后出

例:栈模板(z.h)

#ifndef STACK_CLASS
#define STACK_CLASS

#include<iostream.h>
#include<stdlib.h>
const int MaxStackSize=50;//栈空间50
template<class T>
class Stack
{
	private:
		T stacklist[MaxStackSize];
		int top;
	public:
		Stack(void);//构造函数
		vod Push(const T&item);//进栈
		T Pop(void);//出栈
		void ClearStack(void);//清空整个栈
		T Peek(void)const;
		int StackEmpty(void)const;//判断栈是否空
		int StackFull(void)const;//判断栈是否满
};

//构造函数
template<class T>
Stack<T>::Stack(void):top(-1)//栈顶初始化为-1
{}

//将元素item压入栈
template<class T>
void Stack<T>::Push(const T&item)
{
	//如果栈满,程序终止
	if(top==MaxStackSize-1)
	{
		cerr<<"Stack overflow!"<<endl;
		exit(1);
	}
	top++;//栈顶指针增1
	stacklist[top]=item;//新元素压入栈顶
}

//讲栈顶元素弹出栈
template<class T>
T Stack<T>::Pop(void)
{
	T temp;
	if(top==-1)
	{//如果栈空,程序终止
		cerr<<"Attempt to pop an empty stack!"<<endl;
		exit(1);
	}
	temp=stacklist[top];//取出栈顶元素
	top--;//栈顶指针自减
	return temp;//返回栈顶元素
}

//访问栈顶元素
template<class T>
T Stack<T>::Peek(void)const
{
	if(top==-1)]
	{//如果栈空,程序终止
		cerr<<"Attempt to peek at an empty stack!"<<endl;
		exit(1);
	}
	return stacklist[top];//返回栈顶元素
}

//测试是否栈空
template<class T>
int Stack<T>::StackEmpty(void)const
{//如果栈空则返回TRUE,否则返回FALSE
	return top==-1;
}

//测试是否栈满
template<class T>
int Stack<T>::StackFull(void)const
{//如果栈满返回true,否则false
	return top==MaxStackSize-1;
}

//清空栈
template<class T>
void Stack<T>::ClearStack(void)
{
	top=-1;
}
#endif //STACK_CLASS


栈应用

例:实现一个简单计算器,能够进行加减乘除和乘方运算。使用时,算是采用后缀输入法,例如计算

“3+5”则输入“3 5 +”。乘方运算符用“^”表示。每次运算在前次结果基础上进行,若要将前次运算结果清

除,可键入“c”。当键入“q”时,程序结束。

jsq.h

//z2.h
#include<iostream.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>
enum Boolean{False,True};
#include"z.h"
class Calculator
{
private:
	Stack<int>S;	//栈S
	void Enter(int num);
	Boolean GetTwoOperands(int& opnd1,int& opnd2);
	void Compute(char op);
public:
	Calculator(void){}
	void Run(void);
	void Clear(void);
};
void Calculator::Enter(int num)//私有成员函数,输入入栈
{S.Push(num);}

Boolean Calculator::GetTwoOperands(int& opnd1,int&opnd2)
{//私有成员函数,判断两个操作数是否存在,栈中弹出
	if(S.StackEmpty())
	{cerr<<"Missing operand!"<<endl;
	return False;
	}
	opnd1=S.Pop();
	if(S.StackEmpty())
	{cerr<<"Missing operand!"<<endl;
	return False;
	}
	opnd2=S.Pop();
	return True;
}

//正整数计算函数
void Calculator::Compute(char op)
{
	Boolean result;
	int operand1,operand2;
	result=GetTwoOperands(operand1,operand2);
	if(result==True)
	{
		switch(op)
		{
		case'+':S.Push(operand2+operand1);break;
		case'-':S.Push(operand2-operand1);break;
		case'*':S.Push(operand2*operand1);break;
		case'/':if(operand1==0)
				{
					cerr<<"Divide by 0!"<<endl;
					S.ClearStack();
				}
			else
				S.Push(operand2/operand1);break;
		case:'^':S.Push(pow(operand2,operand1));break;
		}
		cout<<'='<<S.Peek()<<' ';
	}
	else
		S.ClearStack
}
//运算符,按键处理函数
void Calculator::Run(void)
{
	char c[20];
	while(cin>>c,*c!='q')
		switch(*c)
	{
	case'c':S.ClearStack();break;
	case'-':if(strlen(c)>1)//判断是否为负数
			Enter(atoi(c));//atoi:把字符串转成整形数
			else 
			Compute(*c);break;//是正数就去compute那执行
	case'+':
	case'*':
	case'/':
	case'^':
		Compute(*c);break;
	default:
		Enter(atoi(c));break;
	}
}

void Calculator::Cear(void)
{S.ClearStack();}//清空栈

计算器.cpp

#include"jsq.h"
void main(void)
{
	Calculator CALC;
	CALC.Run();
}





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值