只能从一端访问的线性群体
特点:先进后出
例:栈模板(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();
}