栈的总结
百度解释~
栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
我的理解
从上面看到百度解释,栈是一种运算受限的线性表,仅能在表的一端进行插入和删除运算,举个例子,就像我们装衣服的收纳箱,把衣服叠好一件件装进收纳箱,放衣服,取衣服就像在栈上操作,你只能先把上面的衣服一件件取出来,即:先放的后取,后放的先取。放在栈上说,就是先进后出。
明白了栈的定义,现在要实际的实际,首先是它的逻辑结构:线性表。它是线性的。
存储结构:
最常用的就是顺序存储跟链式存储,其中顺序存储用数组,链式存储用链表。下面就这2中存储方式分别写一下对栈的操作~
顺序存储结构
先进行分析下:首先要分配一个足够大的数组(这里就出现了一个问题,要是分配的空间小,就会出现溢出的情况,这是一个潜在的隐患,但是要是分配的太过大,又会出现浪费空间,对于链式存储,要多少就给多少,不用担心空间太小或浪费),现在有了这个数组,需要的还有,必须有个东西能一个控制一端不让操作(数组的前端从下标为0开始),一端要进行增删,这样就可以说是具备了栈有的特点,不让操作的叫栈底,进行操作的是栈顶~
栈的定义:~
#defien MAX 100
typedef struct STStack* pSTStack;
struct STStack
{
int date[MAX];
int top; //控制栈顶
};
初始化~
pSTStack initialize()
{
pSTStack S;
S = (pSTStack)malloc(sizeof(STStack));
S->top = -1;
return S;
}
判空~
int IsEmpyt(pSTStack S)
{
if(S->top==-1) {
return 1;
}
else {
return 0;
}
}
进栈~
int Push(pSTStack S,int x)
{
if (S->top == MAX-1) {
return 0;
}
else {
S->top++;
S->date[S->top]=x;
return 1;
}
}
出栈~
int Pop(pSTStack S,int &x)
{
if(isEmpty(pSTStack S)==1) {
return 0;
}
else {
x = S->date[S->top];
S->top--;
return 1;
}
}
得到栈顶~
int GetTopdate(pSTStack S)
{
if(isEmpty(S) == 1) {
return 0;
}
else {
return S->date[s->top];
}
}
销毁栈~
int Destroy(pSTStack *S)
{
if(*S) {
free(S);
*S=NULL;
return 1;
}
return 0;
}
链式存储结构
控制入栈出栈的端口,栈顶一般是链表的头,第一个节点,栈底一般是最后一个节点。
定义~
typedef struct pStack
{
int date;
struct pStack *next;
}m_pStack;
初始化~
void initStack(m_pStack *&a_Stack)
{
a_Stack = new pStack;
a_Stack->next = NULL;
}
判空~
int isEmpty(m_pStack *a_Stack)
{
if (NULL == a_Stack->next) {
return 1;
}
else {
return 0;
}
}
进栈~
入栈:
int push(m_pStack *top, int x)
{
m_pStack *p;
if((p = ( m_pStack*)malloc(sizeof(m_pStack))) == NULL) {
return 0;
}
p->date = x;
p->next = top->next; //用的是头插法,top始终是栈顶。
top->next = p;
return 1;
}
出栈~
int pop(m_pStack* top)
{
m_pStack* p;
int x;
if(NULL == top->next) {
return NULL;
}
p=top->next;
top->next=p->next; //删除节点,用x记录要删除的元素。
x=p->date;
free(p);
return x;
}
以上,欢迎留言交流~