风言枫语  

是一种被限制在只能在表的一端进行插入和删除运算的线性表。         (局部变量是用栈来保存的)


可以进行插入和删除的一端称为 栈顶(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;
}

 

posted on 2013-09-05 19:08  风言枫语  阅读(167)  评论(0编辑  收藏  举报