链式栈

来源:互联网 发布:大数据概念股一览表 编辑:程序博客网 时间: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