栈是限定仅在表尾进行插入或者删除操作的线性表。各位也可以到360云盘中下载完整程序,运行环境为vc++6.0
http://yunpan.cn/cVKkv9fmsp4wB 访问密码 b737
1 typedef struct 2 { 3 SelemType *base; 4 SelemType *top; 5 int stacksize; 6 }SqStack;
现在来介绍下栈的操作实现。
/******************************************************************** 函数名称: InitStack 函数作用: 构造一个空栈 输入参数: s 输出参数: 无 返回值: FALSE or TRUE ********************************************************************/ Status InitStack(SqStack &s) { s.base=(SelemType *)malloc(STACK_INIT_SIZE*sizeof(SelemType)); //申请空间 if(!s.base) return FALSE; //如果申请不成功,返回FALSE s.top=s.base; //申请成功,令栈顶指针等于栈尾指针 s.stacksize=STACK_INIT_SIZE; //stacksize表示申请分配的空间大小 return TRUE; }
/******************************************************************** 函数名称: Push 函数作用: 将元素e入栈 输入参数: 栈s,元素e 输出参数: 无 返回值: FALSE or TRUE 时间复杂度:O(1) ********************************************************************/ Status Push(SqStack &s,SelemType e) { if((s.top-s.base)>=s.stacksize) { s.base=(SelemType *)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(SelemType)); if(!s.base) return FALSE; s.top=s.base+s.stacksize; s.stacksize+=STACKINCREMENT; } *s.top++=e; return TRUE; }
/******************************************************************** 函数名称: StackBrower 函数作用: 遍历 输入参数: 栈s 输出参数: 无 返回值: FALSE or TRUE 时间复杂度:O(n) ********************************************************************/ Status StackBrower(SqStack s) { if(!s.base) { cout<<"不存在栈s"<<endl; return FALSE; } if(s.top==s.base) { cout<<"s为空栈"<<endl; return FALSE; } while(!(s.top==s.base)) { cout<<*(--s.top)<<" "; } cout<<endl; return TRUE; }
/******************************************************************** 函数名称: DestroyStack 函数作用: 销毁空栈 输入参数: 栈s 输出参数: 无 返回值: FALSE or TRUE 时间复杂度:O(1) ********************************************************************/ Status DestroyStack(SqStack &s) { free(s.base); //只需要释放base指针 s.base=NULL; return TRUE; }
/******************************************************************** 函数名称: ClearStack 函数作用: 销毁空栈 输入参数: 栈s 输出参数: 无 返回值: FALSE or TRUE 时间复杂度:O(1) ********************************************************************/ Status ClearStack(SqStack &s) { if(s.top==s.base) return TRUE; s.top=s.base; return TRUE; }
/******************************************************************** 函数名称: StackEmpty 函数作用: 判断是否为空栈 输入参数: 栈s 输出参数: 无 返回值: 0非空栈 or 1空栈 时间复杂度:O(1) ********************************************************************/ Status StackEmpty(SqStack &s) { return(s.base==s.top); }
/******************************************************************** 函数名称: StackLength 函数作用: 获取当前储存数据的长度 输入参数: 栈s 输出参数: 无 返回值: 栈长 时间复杂度:O(1) ********************************************************************/ int StackLength(SqStack s) { return (s.top-s.base); } Status GetTop(SqStack s,SelemType &e) { e=*(s.top-1); return TRUE; }
接下来就是main函数测试代码
#include"StackLib.h" void main() { int e[20]; int i=0; int a; for(i=0;i<20;i++) e[i]=i; SqStack s; InitStack(s); //构造一个空栈 for(i=0;i<20;i++) { Push(s,e[i]); //数据入栈 } StackBrower(s); //遍历堆栈 cout<<"当前储存数据:"<<StackLength(s)<<"个"<<endl; GetTop(s,a); //获得栈顶元素,并打印 cout<<a<<endl; ClearStack(s); //清空栈 StackBrower(s); //遍历栈 cout<<"1为空栈,0非空:"<<StackEmpty(s)<<endl; //判断栈是否为空 DestroyStack(s); //销毁堆栈 StackBrower(s); // }
时间: 2024-10-07 20:34:57