C++模板实现链式栈操作

需积分: 9 0 下载量 135 浏览量 更新于2024-08-05 收藏 1KB TXT 举报
"C++模板编程,用于实现链式栈的数据结构及基本操作,包括初始化、入栈、出栈、判断栈空、获取栈顶元素和计算栈的长度。" 在给定的代码中,我们看到了一个使用C++模板类实现的链式栈。链式栈是一种基于链表数据结构的栈,它允许我们在运行时动态地添加或删除元素,而不需要预先确定栈的大小。以下是代码中的关键知识点和详细解释: 1. **链式栈定义**: - 定义了两个模板类,`LinkNode` 和 `LinkStack`。 - `LinkNode` 类表示链栈中的单个节点,包含一个数据域(`T data`)和一个指向下一个节点的指针域(`LinkNode<T>* next`)。 - `LinkStack` 类是实际的链栈,它包含了对链栈操作的方法。 2. **模板类**: - 使用模板类可以创建具有不同数据类型的链栈。`<T>` 表示可以是任何类型的数据,如整型、浮点型、自定义对象等。 3. **成员函数**: - `LinkStack()`:构造函数,用于初始化链栈。创建一个头节点,并将其指针域设置为 NULL,表示栈为空。同时初始化栈的长度为0。 - `Push(T c)`:将元素 `c` 入栈。创建一个新的节点,存储数据 `c`,然后将其插入到链栈的头部。 - `Pop()`:元素出栈。删除链栈头部的节点,更新头节点的指针,并减少栈的长度。 - `isEmpty()`:检查链栈是否为空。如果头节点的下一个节点为 NULL,则栈为空,返回 true;否则返回 false。 - `GetTop()`:获取栈顶元素。返回链栈头部节点的数据,但不删除它。 - `Length()`:计算链栈的长度。通过遍历链栈并计数来得到当前栈中元素的数量。 4. **内存管理**: - 链栈的节点使用 `new` 运算符动态分配内存,这使得在运行时可以根据需要增加或减少节点。 - 出栈操作时,使用 `delete` 释放不再使用的节点内存,避免内存泄漏。 5. **注意事项**: - 出栈操作时,检查栈是否为空(`if(p==NULL) return;`),防止删除头节点后导致空指针异常。 - 在链栈的大部分操作中,都对栈的长度 `len` 进行了更新,这是为了保持栈的实时长度信息,方便进行其他操作。 这个链式栈的实现提供了一个基础的C++数据结构,可以用于各种需要栈操作的场景,如表达式求值、深度优先搜索等。由于使用了模板,所以它可以灵活地处理各种数据类型,增加了代码的可复用性。

#include<iostream> typedef int ElemType; typedef struct StackNode{ ElemType data; struct StackNode *next; }StackNode,*LinkStack; int InitStack(LinkStack &S) { S=NULL; return 1; } void DestroyStack(LinkStack &S){ LinkStack *p; LinkStack *q; p=GetTop(S); while (!p) { q = p; p = p->next; free(q); } } int ClearStack(LinkStack &S){ while(S.top!=S.base){ S->top=0; S->top--; } if(S.top==S.base) printf("清空成功/n"); else printf("清空失败/n"); } int StackEmpty(LinkStack S){ if(S.base==S.top) return OK; else return ERROR; } void StackLength(S){ int t; t=S->top-S->base; cout>>t; } void GetTop(LinkStack S){ if(S!=NULL) return S->data; } int Push(LinkStack S,int e){ p=new StackNode; p->data=e; p->next=S; S=p; return OK; } int Pop(LinkStack &S,int &e){ if(S==NULL) return ERROR; e=S->data; p=S; S=S->next; delete p; return OK; } int StackTraverse(S){ while(S.top!=-1){ cout<<S->data[S->top]<<" "; S->top--; cout<<endl; } } void conversion(int N,int e){ //对于一个非负八进制数,打印输出其等值的十进制数 InitStack(S);int i=10,t=0,x,n=0; while(N/i!=0){ t++; i*=10; } while(N){ x=N/pow(10,i)%10; i=i/10; Push(S,x); } while(!StackEmpty(S)){ Pop(S,e); x=x+(e*pow(8,n)); n++; } cout<<x; } int main(){ cout<<"入栈元素为"<<Push(S,e)<<endl; cout<<"栈顶元素为:"<<GetTop(S)<<endl; cout<<"栈:"; StackTraverse(S); DestroyStack(S); cout<<endl<<"销毁后:"; if(StackEmpty(S)) cout<<"是空栈"<<endl; cout<<endl<<"请输入想转换成八进制的整数:"; cin>>N;cout<<"转换之后的数是"; conversion(N); }

2023-05-11 上传
2023-06-01 上传