跳到主要内容

02Stack

Stack

1、栈存储的内容

栈中存放任意类型的变量,但必须是auto类型修饰的,即自动类型的局部变量。也就是前面我们接触使用最多的变量。

2、栈存储的特点

随用随开、用完即消。内存的分配和销毁系统自动完成,不需要人工干预。

(FILO 先进后出 LIFO 后进先出)

3、栈溢出

​ 局部变量过多,过大, 或 递归层数太多。

现实意义:

递归的问题,本质就是函数压栈。如果利用栈工具,递归的操作,就可以完全可以用循环加栈的组合方式来实现 

top始终向待压入位置

线式存储实现

mystack.h

#ifndef MYSTACK_H
#define MYSTACK_H

typedef struct _Stack
{
int _len;
int _top;
char *_space; //游标
}Stack;

void initStack(Stack *s,int size);

int isStackFull(Stack *s);
int isStackEmpty(Stack *s);

void push(Stack *s,char ch);

char pop(Stack *s);
void clearStack(Stack *s);
void resetSatck(Stack *s);
#endif // MYSTACK_H

实现

mystack.c

#include"mystack.h"


void initStack(Stack *s,int size)
{
s->_top = 0;
s->_len = size;
s->_space = (char *)malloc(sizeof(char)*s->_len);
}

int isStackFull(Stack *s)
{
// if(s->_top==s->_len)
// return true;
// else
// return false;

return s->_top == s->_len;
}

int isStackEmpty(Stack *s)
{
return s->_top == 0;
}

void push(Stack *s,char ch)
{
s->_space[s->_top++]=ch;
}

char pop(Stack *s)
{
return s->_space[--s->_top];
}

void clearStack(Stack *s) //清空 销毁栈
{
free(s->_space);
}

void resetSatck(Stack *s)
{
s->_top=0;
}

主函数

main.c

#include <stdio.h>
#include"mystack.h"


int main(int argc, char *argv[])
{
Stack s;
initStack(&s,100);

char ch;
for( ch='a';ch<='z';ch++)
{
if(!isStackFull(&s))
push(&s,ch);
}

// resetSatck(&s);

while(!isStackEmpty(&s))
printf("%c\t",pop(&s));

return 0;
}

链式存储实现

设计时选择表头,作为栈顶指针,而不是表尾(单向链表(不含头节点))。不同于线式存储,不需要作判满操作

myStackList.h

#ifndef __MYSTACKLIST__
#define __MYSTACKLIST__

typedef struct _SNode
{
char _data;
struct _SNode * _next;
}SNode;

typedef struct _Stack
{
SNode * top;

}Stack;

void initStack(Stack *ps);

int isStackEmpty(Stack *ps);

int isStackFull(Stack *ps);

void push(Stack *ps, char ch);

char pop(Stack *ps);

void clearStack(Stack *ps);

void resetStack(Stack *ps);



#endif

实现

myStackList.cpp

#include"myStackList.h"
#include<iostream>



void initStack(Stack *ps)
{
ps->top = new SNode;
ps->top->_next = nullptr;
}

int isStackEmpty(Stack *ps)
{
return ps->top->_next == nullptr;
}

int isStackFull(Stack *ps)
{
return 0;
}

void push(Stack *ps, char ch)
{
SNode *cur = new SNode;
cur->_data = ch;

cur->_next = ps->top->_next;
ps->top->_next = cur;


}

char pop(Stack *ps)
{
SNode *t = ps->top->_next;
char ch = t->_data;

ps->top->_next = t->_next;
free(t);
return ch;
}
void resetStack(Stack *ps)
{
while (!isStackEmpty(ps))
pop(ps);
}

void clearStack(Stack *ps)
{
resetStack(ps);
free(ps->top);
}

主函数

main.cpp

#include<iostream>
#include"myStackList.h"

int main()
{
Stack s;
initStack(&s);

for (char ch = 'A'; ch <= 'M'; ch++)
{
push(&s, ch);
}

while (!isStackEmpty(&s))
{
std::cout << pop(&s)<<" ";
}

clearStack(&s);

system("pause");
return 0;
}