链式栈
来源:互联网 发布:大数据概念股一览表 编辑:程序博客网 时间:2024/05/16 13:07
链式栈是特殊的单链表,它只是只能满足链表的一些功能,只能尾插和尾删。
链式栈所尊崇的结点如图
所实现的功能如下:
bool StackEmpty(Stack *st);
void InitList(Stack *st);//初始化
bool push(Stack *st,ElemType x);//尾插
bool pop(Stack *st);//尾删
void ShowStack(Stack *st);//打印
void clear(Stack *st);//清除
void destroy(Stack *st);//摧毁
int length(Stack *st);//长度
ElemType GetTop(Stack *st);//栈顶元素
具体的代码如下:
头文件:
#ifndef _STACKLIST_H#define _STACKLIST_H#include<iostream>#include<assert.h>using namespace std;#define ElemType inttypedef struct Node{ElemType data;struct Node *next;}Node,*PNode;typedef struct Stack{PNode top;PNode rear;size_t size;}Stack;bool StackEmpty(Stack *st);//判断栈是否为空void InitList(Stack *st);//初始化bool push(Stack *st,ElemType x);//尾插bool pop(Stack *st);//尾删void ShowStack(Stack *st);//打印void clear(Stack *st);//清除void destroy(Stack *st);//摧毁int length(Stack *st);//长度ElemType GetTop(Stack *st);//栈顶元素#endif
函数定义文件:
#include "StackList.h"bool StackEmpty(Stack *st) //判断为空{if(st->size == 0){return true;}return false;}void InitList(Stack *list) //初始化{Node* s = (Node*)malloc(sizeof(Node));//开辟头结点空间assert(s != NULL); //断言看是否开辟成功s->next = NULL; //构造头结点空间list->rear = list->top = s;list->size = 0;}bool push(Stack *st, ElemType x) //头插{Node *p = (Node*)malloc(sizeof(Node));//开辟新结点assert(p != NULL); //断言看是否开辟成功p->data = x; //赋值p->next = st->top->next; //头插st->top->next = p; //重新给st->top->next赋值st->size++; //长度加一return true;}void ShowStack(Stack *st) //打印{Node *p = st->top->next ; //指向栈顶元素cout<<"NULL"<<endl; //栈顶为NULLwhile(p != NULL) //从栈顶向下打印,直至为NULL{cout<<p->data <<endl; //打印数值p = p->next ; //指针移动}}bool pop(Stack *st) //头删{if(StackEmpty(st)) //判断为空{cout<<"栈已空,不能出栈!"<<endl; //为空输出return false;}Node *p = st->top->next; //指向栈顶元素if(st->size == 1) //只有第一个结点{free(p); //直接删除st->top->next = NULL; //st->top置空st->rear = st->top; //st->rear置空}else{st->top->next = p->next ; //头删free(p); //删除}st->size--;return true;}ElemType GetTop(Stack *st) //栈顶元素{if(StackEmpty(st)) //判断为空 {printf("栈已空,没有栈顶元素!\n");//输出return -1;}return st->top->next->data; //输出栈顶元素}void clear(Stack *st) //清除{Node *p = st->top->next; //指向栈顶元素while(p != NULL) //判断是否为空{st->top->next = p->next; //头删free(p); p = st->top->next; //指针移动}st->rear = st->top ; //栈顶等于栈底指针st->size = 0; //长度为零}void destroy(Stack *st) //摧毁{clear(st); //清除栈free(st->top); //摧毁栈顶指针st->top = st->rear = NULL; //栈底栈底指针置空}int length(Stack *st) //长度{return st->size ; }
测试文件:
#include "StackList.h"void main(){Stack myStack; InitList(&myStack);int select = 1;ElemType item;ElemType pos;Node *p = NULL;while(select){cout<<"*************************************"<<endl;cout<<"* [0] quit_system [1] push *"<<endl;cout<<"* [2] show_seqStack [3] pop *"<<endl;cout<<"* [4] clear [5] destroy *"<<endl;cout<<"* [6] length [7] getTop *"<<endl; cout<<"*************************************"<<endl;cout<<"请选择:>";cin>>select;switch(select){case 1:cout<<"请输入要插入的数据(-1结束):>";while(cin>>item,item!=-1){push(&myStack,item);}break;case 2:ShowStack(&myStack);break;case 3:pop(&myStack);break;case 4:clear(&myStack);break; case 5:destroy(&myStack);break;case 6:cout<<"栈空间为:"<<length(&myStack)<<endl;break;case 7:cout<<"栈顶元素为:"<<GetTop(&myStack)<<endl;break;default:break;}}destroy(&myStack);}
对于具体的操作,测试文件写得很清楚,在这里便不用截图说明了。代码有什么问题,希望大家可以指出,谢谢。
0 0
- 链式栈
- 链式栈
- 链式栈
- 链式栈
- 链式栈
- 链式栈
- 链式栈
- 栈链式
- 链式栈
- 链式栈
- 链式栈
- 链式栈
- 栈-链式
- 链式栈
- 链式栈
- 链式栈
- 链式栈
- 链式栈
- Java 实现网站当前在线用户统计
- 4Sum-LeetCode
- UVA1213 Sum of Different Primes(素数打表+dp)
- 聚类算法——K临近(KNN)
- matlab中axes用法
- 链式栈
- 聚类算法——K-means
- 【cocos2d-x 3.5】Lua的简单面向对象
- RedHat Linux 实现root身份的Telnet登录
- 很强大的 Swipe Layout:AndroidSwipeLayout
- UVA 1210 Sum of Consecutive Prime Numbers(数论)
- 在linux中配置安装telnet服务
- uoj 104 [apio2014 T2]
- [Struts2应用开发] 统一的登录验证