图中元素是以a1,a2,…,an的顺序进栈,退栈的次序却是an,an-1,…,a1。 具体算法演示请点击查看【算法演示】 2、栈的基本运算 (1)InitStack(S) 初始化操作,设定一个空栈S。 (2)EmptyStack(S) 判空栈操作,若S为空栈,则返回TRUE,否则返回FALSE。 (3)FullStack(S) 判栈满。若S为满栈,则返回TRUE,否则返回FALSE。 注意: 该运算只适用于栈的顺序存储结构。 (4)Push(S,e) 进栈。若栈S不满,在S栈顶插入一个元素e,栈顶位置由top指针指出。 (5)Pop(S) 退栈。若栈S非空,则将S的栈顶元素删去,并返回该元素。 (6)GetTop(S) 取栈顶元素。若栈S非空,则返回栈顶元素,但不改变栈的状态。 (7)ClearStack(S) 置栈空操作,已知S为栈,不论操作之前的栈是否为空栈,本操作的结果都是将S置为空栈。 (8)CurrentStack(S) 求当前栈中元素的个数。 (9)DestroyStack(S) 销毁S栈。
栈的链式存储结构称为链栈。 1、链栈的类型定义 栈可以用单链表做为存储结构,链表中数据元素结点描述如下: typedef int ElemType; struct Lsnode { ElemType data; struct Lsnode *next; }; ![]() 图3.4展示了单链表栈的数据元素与栈顶指针top的关系。 图3.4(a)是含有3个数据元素A,B,C的栈,A是栈底元素,指针型变量top指向栈顶元素C;图3.4(b)是在(a)的基础之上出栈一个元素后的状态;图3.4(c)是在(b)的基础上又进栈一个元素X后的状态。需指明的是,一个链表栈由栈顶指针top唯一确定。当top为NULL时,则是一个空栈 【算法3.3】 LsStack:: LsStack () //构造函数,建立一个空栈 { top=NULL; } void LsStack::Display() //输出显示单链表栈内容 { Lsnode *p; p=top; while(p!=NULL) { cout<<” ”<<p->data; p=p->next; } cout<<"结束!outend!" ; } 上述算法可以输出单链表栈。首先,判别是否栈空。如果不是空栈,即将线性表的数据元素一一输出。在这个算法中,我们又复习到单链表的相关内容。可见,栈是一种特殊的线性结构,它与前一章中的线性表数据结构有密切的联系。 2、链栈的基本运算 (1) 入栈 【算法3.4】 void LsStack::Push(ElemType x) { Lsnode *p; p=new Lsnode; // 申请一个结点空间 p->data=x; p->next=top; top=p; } //进栈Push 首先,建立一新结点。然后,把这个结点插到栈顶,并且令栈顶指针top 指向它。 (2) 出栈 【算法3.5】 ElemType LsStack::Pop() { Lsnode *p; ElemType x; if(top!=NULL) { p=top; top=top->next; x=p->data; free(p); return(x); } else {cout<<"Stack null! \n";exit(1); } }/*出栈Pop*/ 由上述算法可看出,栈在链表存储结构条件下进栈一个元素时一般不考虑栈满上溢出问题,而出栈时必须考虑栈空问题。
|
c语言之栈
最新推荐文章于 2023-06-04 23:13:04 发布