栈的简介
栈是一种特殊的线性表,仅能在线性表的一端操作,栈顶允许操作,栈底不允许操作。
具有后进先出(Last In First Out)特性
栈的基本操作具有:初始化栈,入栈,出栈,判断栈是否空,获取栈顶数据,获取栈的元素个数,清空栈,销毁栈
顺序结构实现栈:
栈的结构体设计:
typedef struct
{
ElemType *elem; //数组或者指针,用于存放栈数据,指针的话需要分配空间
int top; //栈顶位置,用于记录当前栈顶在哪
int size; //栈的大小
}STACK_SQ;
接口实现:
//初始化栈,给栈分配空间,初始值,成功返回true,出错返回false
bool InitStack(STACK_SQ &sq, int size);
//入栈,需要判断是否已达栈顶,如果达到栈顶,退出。成功返回true,出错返回false
bool PushStack(STACK_SQ &sq, ElemType e);
//出栈,需要判断是否为空栈,是则退出,出栈成功返回出栈元素,出错返回-1
int PopStack(STACK_SQ &sq, ElemType &e);
//判断栈是否为空,如果为空,返回true,出错返回false;
bool IsEmptyStack(STACK_SQ sq);
//获取栈顶数据,需要判断是否是空栈,获取成功返回true,失败返回false
bool GetTopStack(STACK_SQ sq, ElemType &e);
//获取栈的元素个数,空的话返回0,返回元素个数
int GetNumStack(STACK_SQ sq);
//清空栈
void ClearStack(STACK_SQ &sq);
//销毁栈
void DestroyStack(STACK_SQ &sq);
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
using std::cout;
using std::endl;
typedef int ElemType;
//栈结构体
typedef struct
{
ElemType *elem;
int top;
int size;
}STACK_SQ;
//初始化栈
bool InitStack(STACK_SQ &sq, int size)
{
sq.elem = (ElemType *)malloc(size * sizeof(ElemType));
if(sq.elem == NULL) return false;
sq.top = 0;
sq.size = size;
return true;
}
//入栈
bool PushStack(STACK_SQ &sq, ElemType e)
{
//判断是否已到栈顶
if(sq.top >= sq.size )
{
cout<<"out of stack size"<<endl;
return false;
}
sq.elem[sq.top++] = e;
//sq.elem+(sq.top++) = e;
return true;
}
//出栈
int PopStack(STACK_SQ &sq, ElemType &e)
{
if(sq.top == 0)
{
cout<<"stack is empty!"<<endl;
return -1;
}
e = sq.elem[sq.top - 1];
sq.top--;
return e;
}
//判断栈是否为空
bool IsEmptyStack(STACK_SQ sq)
{
if(0 == sq.top)
return true;
return false;
}
//获取栈顶元素
bool GetTopStack(STACK_SQ sq, ElemType &e)
{
if(0 == sq.top)
{
cout<<"stack is empty!"<<endl;
return false;
}
e = sq.elem[sq.top - 1];
return true;
}
//获取栈的元素个数
int GetNumStack(STACK_SQ sq)
{
int size = sq.top;
return size;
}
//清空栈
void ClearStack(STACK_SQ &sq)
{
sq.top = 0;
//sq.size = 0;
}
//销毁栈
void DestoryStack(STACK_SQ &sq)
{
sq.top = 0;
sq.size = 0;
free(sq.elem);
sq.elem = NULL;
}
const int SIZE = 10;
int main()
{
cout<<"init stack"<<endl;
STACK_SQ sq;
if(!InitStack(sq, SIZE))
{
cout<<"init stack fail!"<<endl;
return -1;
}
cout<<"init stack success!"<<endl;
int a[SIZE] = {1,2,3,4,5,6,7,8,9,10};
for(int i = 0; i < SIZE; i++)
{
if(!PushStack(sq, a[i]))
{
cout<<a[i]<<":push stack faile!"<<endl;
break;
}
cout<<"push stack:"<<a[i]<<endl;
}
cout<<"push stack success!"<<endl;
cout<<"num stack:"<<GetNumStack(sq)<<endl;
ElemType e;
for(int i = 0; i < SIZE; i++)
{
if(PopStack(sq, e) != -1)
{
cout<<"pop stack:"<<e<<endl;
}
}
cout<<"clear stack"<<endl;
ClearStack(sq);
cout<<sq.size<<endl;
cout<<"destory stack"<<endl;
DestoryStack(sq);
cout<<sq.size<<endl;
return 0;
}
打印结果:
init stack
init stack success!
push stack:1
push stack:2
push stack:3
push stack:4
push stack:5
push stack:6
push stack:7
push stack:8
push stack:9
push stack:10
push stack success!
total num stack:10
pop stack:10
pop stack:9
pop stack:8
pop stack:7
pop stack:6
pop stack:5
pop stack:4
pop stack:3
pop stack:2
pop stack:1
clear stack
10
destory stack
0
参考:
https://github.com/huihut/interview/edit/master/DataStructure/SqStack.cpp#L1
https://blog.51cto.com/9291927/2063393