栈 是一种被限制在只能在表的一端进行插入和删除运算的线性表。 (局部变量是用栈来保存的)
可以进行插入和删除的一端称为
栈顶(top),另一端称为
栈底(bottom),当表中没有元素时(表长为0的栈)称为
空栈。
栈的修改是按
后进先出的原则进行,因此栈被称为后进先出(Last in first out)线性表。
堆和栈是占一块内存的,栈向下存,堆向上存,当堆和栈相遇的时候内存就占满了
存入与取出
基本运算:
1.初始化
InitStack(S)
构造一个
空栈S
2.StackEmpty(S)
判断栈空,若S为空栈,则返回true,否则返回false
3.StackFull(S)
判断栈满,若S为满栈,则返回true,否则返回false
注意:该运算只适合顺序栈的存储结构。
如果栈需要很大内存的时候可以用
虚拟内存的方式,在物理内存不够的时候可以用磁盘的内存来虚拟内存使用。但会使速度变慢。
4.Push(S,x)
进栈,若栈S不满,则将元素x插入到S的栈顶。
5.Pop(S)
退栈,若栈S非空,则将S的栈顶元素删去,并返回该元素。
6.StackTop(S)
取栈顶元素,若栈S非空,则返回栈顶元素,但栈状态不变。
顺序栈
定义:栈的顺序存储结构。
#define LISTSIZE 100
//栈的最大容量
typedef char DataType;
//保存的数据类型
typedef struct
//C程序员的使用技巧 SeqStack并不是变量而是struct结构体的别名,因此在C中定义结构变量需要加struct 所以用这种方式可以省去struct
{
DataType data[ LISTSIZE ];
int top;
//栈顶指针
}SeqStack;
初始化 置栈空
void InitStack(SeqStack *_S)
{
_S-> top =-1;
}
判断栈空
bool StackEmpty(SeqStack* s)
{
return s->top==-1;
}
判断顺序栈满
bool StackFull(SeqStack *s)
{
return LISTSIZE -1==s-> top ;
栈顶指针指向内存-1,这样就是满了,因为栈顶指针从0开始。。
}
进栈
bool Push(SeqStack* s,DataType x)
{
if(StackFull(s))
return false;
s->data[++s->top]=x;
return true;
}
顺序退栈
bool Pop(SeqStack* s,DataType* data)
{
if(StackEmpty(*s))
return false;
else
{
*data=s->data[s->top];
s->top--;
return true;
}
}
链栈
栈顶指针就是链表的头指针
#define LISTSIZE 100
//栈的最大容量
typedef char DataType;
//保存的数据类型
typedef struct stacknode{
DataType date;
//内容
struct stacknode *next;
//指针
}StackNode;
typedef StackNode* LinkStack;
初始化 置栈空
void InitLinkStack(LinkStack *_S)
{
*_S=NULL;
}
判断链栈空
bool StackLinkEmpty(LinkStack s)
{
return s==NULL;
}
虚拟内存
bool VirtualMemory(LinkStack s)
{
FILE* stream;
if(s == NULL)
{
if((stream = fopen("memory.txt","r+")) != NULL)
{
fseek(stream, -sizeof(StackNode), SEEK_END);
fread(s,sizeof(StackNode),1,stream);
while (NULL == s->next)
{
fseek(stream, -2 * sizeof(StackNode), SEEK_CUR);
fread(s,sizeof(StackNode),1,stream);
}
fseek(stream, -sizeof(StackNode), SEEK_CUR);
s->next = NULL;
fwrite(s,sizeof(StackNode),1,stream);
fclose(stream);
return true;
}
else
return false;
}
else
{
if((stream = fopen("memory.txt","a+")) != NULL)
{
s->next = (LinkStack) 1;
fwrite(s,sizeof(StackNode),1,stream);
fclose(stream);
free(s);
return true;
}
else
return false;
}
}
链栈进栈
void Push(LinkStack* s,DataType x)
{
LinkStack p=(LinkStack)malloc(sizeof(stacknode));
if(NULL==p)
{
VirtualMemory(s);
p=(LinkStack)malloc(sizeof(stacknode));
}
p->data=x;
p->next=*s;
*s=p;
}
链栈退栈
bool Pop(LinkStack* pStack,DataType* data)
{
if(StackEmpty(*pStack)))
return false;
LinkStack temp=*pStack;
*data=temp->data;
*pStack=temp->next;
free(temp);
temp=NULL;
return true;
}
int _tmain(int argc, _TCHAR* argv[])
{
LinkStack top,bottom;
InitLinkStack(&top);
_getch();
return 0;
}