栈及栈的应用+回文+中、后缀表达式
1、栈顺序存储结构的基本操作算法实现
(1)栈顺序存储结构的类定义:
class SeqStack { private: int maxsize; DataType *data; //顺序堆栈数组 int top; //栈顶位置指示器 public: SeqStack(int size); //构造函数 ~SeqStack(void) {} //析构函数 void Push(const DataType item); //入栈 DataType Pop(void); //出栈 DataType GetTop(void)const; //取栈顶数据元素 void GetAll(); void Destory(); void ClearAll(); int NotEmpty(void)const //堆栈空否 {return(top==-1);}; int Full(void)const //堆栈满否 {return(top==maxsize-1);}; };
(2)构造栈算法
输入:栈元素个数的最大数size
初始化栈:栈顶指示置为-1,创建存储栈的数组,栈元素个数的最大数maxsize置 为size;
SeqStack::SeqStack(int size) { top=-1; maxsize=size; data=new DataType[maxsize]; }
(3)获得栈顶元素算法
输入:无
前置条件:栈不空
动作:取栈顶数据元素给e
输出:返回栈顶元素值e
后置条件:无
DataType SeqStack::GetTop(void)const //取栈顶数据元素 //取当前栈顶数据元素并返回 { if(top==-1) { cout<<"堆栈空!"<<endl; exit(0); } DataType e=data[top-1]; return e; //返回当前栈顶元素 }
(4)进栈算法
输入:要进栈的项item
前置条件:栈未满
动作:把item压入栈顶
输出:无
后置条件:栈顶增加一个新元素,栈顶指示加1;
void SeqStack::Push(const DataType item) //入栈 //把元素item入栈;堆栈满时出错退出 { if(top==maxsize) { cout<<"堆栈已满!"<<endl; exit(0); } data[top]=item; //先存储item top++; //然后top加1 }
(5)出栈算法
输入:无
前置条件:栈非空
动作:删除栈顶元素
输出:返回删除的栈顶元素值
后置条件:删除栈顶元素,栈顶指示减1
DataType SeqStack::Pop() //出栈 //出栈并返回栈顶元素;堆栈空时出错退出 { if(top==-1) { cout<<"堆栈已空!"<<endl; exit(0); } top--; //top先减1 return data[top]; //然后取元素返回 }
(6)遍历栈算法
输入:无
前置条件:栈非空
动作:遍历输出每个栈非空元素
输出:无
后置条件:无
void SeqStack::GetAll() { if(top==-1) { cout<<"堆栈已空!"<<endl; exit(0); } for(int i=top-1;i>=-1;i--) { cout<<data[i]<<" "; } cout<<endl; }
(7)销毁栈算法
输入:无
前置条件:栈存在
动作:删除存储栈元素的数组
输出:无
后置条件:栈的存储元素区域不存在,栈顶指针归-1,maxsize为0
void SeqStack::Destory() { top=-1; delete data; cout<<"栈的存储元素区域不存在"<<endl; maxsize=0; }
(8)清空栈算法
输入:无
前置条件: 无
动作:清空栈,栈顶指示器归-1;
输出:无
后置条件:栈顶指示为-1
void SeqStack::ClearAll() { top=-1; }
上机实现以上基本操作,写出main()程序:
#include <iostream> typedef int DataType; #include"SeqStack.h" using namespace std; int main() { SeqStack stack1335(10); DataType test[]={2,4,6,8,10}; for(int i=0;i<5;i++) stack1335.Push(test[i]); cout<<"入栈"<<endl; while(!stack1335.NotEmpty()) cout<<stack1335.Pop()<<" "; cout<<"出栈"<<endl; for(int i=0;i<5;i++) stack1335.Push(test[i]); cout<<"入栈"<<endl; stack1335.ClearAll(); cout<<"清空所有"<<endl; stack1335.GetAll(); return 0; }
2、用以上基本算法,实现:void conversion()
将输入10进制数转化为2进制和8进制数
void SeqStack::conversion(int num) { int a=num; while(a) { Push(a%2); a/=2; } cout<<"转换为二进制:"; GetAll(); ClearAll(); while(num) { Push(num%8); num/=8; } cout<<"转换为八进制:"; GetAll(); } }
3、回文是指正读反读均相同的字符序列,如“acdca”、“dceecd”均是回文,但“book”不是回文。利用1中的基本算法,试写一个算法判定给定的字符串是否为回文。(提示:将一半字符入栈,依次弹出与另一半逐个比较)//判s串是否为回文,是则返回1,否则返回0;
int SeqStack::HuiWen(char *s) { int i,j; for(i=0;s[i]!='