顺序栈和链栈的几个基本操作

用c++写的,初始化的时候一定要在形参列表里加上引用操作符(&),要么初始化就用双重指针进行操作。

因为:对谁操作(想要改变谁的值),就要得到谁的地址。如果不加上&的话,就无法改变 main函数里的 指针 s 的值,改变的只是形参的值。


 

目录

顺序栈:

         链栈


 

顺序栈:

//要注意初始化时,形参的那个引用符号(&)必须要加上!否则初始化就用双指针来做!
//其他操作的函数在形参列表里可以不用加上引用符号(&)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<windows.h>
const int MaxSize=100;
typedef struct
{
    int data[MaxSize];
    int top;
}SqStack;
//初始化,就是给指针分配一个空间
void InitStack(SqStack *&s)
{
    s=(SqStack*)malloc(sizeof(SqStack));
    s->top=-1;
}
//销毁栈
void DestoryStack(SqStack *s)
{
    free(s);
}
//入栈操作
bool Push(SqStack *s,int element)
{
    if(s->top==MaxSize-1) return false;
    else
    {
        s->top++;
        s->data[s->top]=element;
        return true;
    }
}
//出栈操作
bool Pop(SqStack *s)
{
    if(s->top==-1) return false;
    else s->top--;
    return true;
}
//取栈顶元素
bool GetTop(SqStack *s,int *element)
{
    if(s->top==-1) return false;
    else
    {
        *element=s->data[s->top];
        return true;
    }
}

int main()
{
    SqStack* s;
    InitStack(s);
    int *element;
    int a[]={1,2,3,4,5,6,7,8,9};
    for(int i=0;i<9;i++)
    {
        Push(s,a[i]);
    }
    while(GetTop(s,element))
    {
        Sleep(600);
        printf("%d\n",*element);
        Pop(s);
    }



    return 0;
}

链栈:

//带头结点的单链表
//根据栈的特性,肯定是用的头插法
#include<iostream>
#include<windows.h>
using namespace std;
typedef struct linknode
{
    int data;
    linknode *next;
}LinkStack;

void InitStack(LinkStack *&s)
{
    s=(LinkStack*)malloc(sizeof(LinkStack));
    s->next=NULL;
}

void DestoryStack(LinkStack *s)
{
    LinkStack *pre,*p;
    pre=s;
    p=pre->next;
    while(p!=NULL)
    {
        free(p);
        pre=p;
        p=pre->next;
    }
    free(pre);
}

void Push(LinkStack *s,int e)
{
    LinkStack *p=(LinkStack*)malloc(sizeof(LinkStack));
    p->data=e;
    p->next=s->next;
    s->next=p;
}
bool Pop(LinkStack *s)
{
    if(s->next==NULL) return false;
    LinkStack *p=s->next;
    s->next=s->next->next;
    free(p);
    return true;
}
bool GetTop(LinkStack *s,int *e)
{
    if(s->next==NULL) return false;
    *e=s->next->data;
    return true;
}
int main()
{
    LinkStack *s;
    InitStack(s);
    int a[]={1,2,3,4,5,6,7,8,9};
    int *element;
    for(int i=0;i<9;i++)
    {
        Push(s,a[i]);
    }
    while(GetTop(s,element))
    {
        Sleep(600);
        printf("%d\n",*element);
        Pop(s);
    }


    return 0;
}
发布了77 篇原创文章 · 获赞 11 · 访问量 5000

猜你喜欢

转载自blog.csdn.net/qq_43346054/article/details/102837962