栈(ADT)

来源:互联网 发布:手机用usb使用电脑网络 编辑:程序博客网 时间:2024/06/05 22:12

1.概念:栈是限制插入和删除只能在一个位置上进行的表
2.注意知识点:
(1).后进先出的特点(LIFO)
(2).存在某个元素位于栈顶,而该元素是唯一可见的元素。
(3).栈的两种实现方式 :数组、链表
3.栈的基本操作:
1、数组实现:
(1).入栈(push)和出栈(pop)

#include <stdio.h>#define maxsize 10typedef int ElementType;typedef struct{    ElementType data[maxsize];    int top1;//栈的栈顶指针  }stack;void push(stack *s,ElementType num){    if(s->top1 == maxsize-1)    {        printf("栈满\n");        return;    }    else    {        s->data[++(s->top1)] = num;        return;    }}ElementType pop(stack *s){    if(s->top1 == -1)    {        printf("栈空!\n");        return 0;    }    else    return s->data[(s->top1)--];}int main(){    stack s;    int t;    for(int i = 0;i<3;i++)    {        push(&s,i);    }    for(int i =0;i<3;i++)    {        t = pop(&s);        printf("%d",t);    }} 

运行结果 :这里写图片描述
(2).两个堆栈的实现入栈、出栈

#include <stdio.h>#define maxsize 10typedef struct{    int data[maxsize];    int top1 ;//栈1的栈顶指针    int top2 ;//栈2 的栈顶指针 }stack;void push(stack *s,int num,int tag){    if(s->top1 == s->top2)//**判断栈是否满**    printf("栈满!\n");    else    {        if(tag == 1)        {            s->data[++(s->top1)] = num;//对第一个栈进行操作         }        else        s->data[--(s->top2)] = num;// 对第二个栈进行操作    } } int pop(stack *s,int tag){    if(tag == 1)    {        if(s->top1 == -1)        printf("栈空!\n");        else        return s->data[(s->top1)--];//对第一个栈进行操作     }     else    {        if(s->top2 == maxsize)        printf("栈空!\n");        else        return s->data[(s->top2)++];     } }int main(){    int tag;    scanf("%d",&tag);    int i,t;    stack s;    s.top1 = -1;s.top2 = maxsize;    for(i = 0;i<4;i++)    {        push(&s,i,tag);    }    for(i = 0;i<4;i++)    {        t = pop(&s,tag);        printf("%d\t",t);     }       } 

运行结果:这里写图片描述
(3)、判断栈是否为空

int Isempty(stack *s){    return s->top1 == -1;}

(4)、判断栈是否满

int IsFull(stack *s){    return s->top1 == maxsize-1;}

2、链表实现:
(1)、建立空栈并判断是否为空

#include <stdio.h>#include <stdlib.h> typedef struct Node{    int data;    struct * next;}stack;stack *createstack(stack *s){    s = (stack *)malloc(sizeof(struct Node));    if(s == NULL)    {        printf("no space!\n");        return NULL;    }    else    {        s->next = NULL;        return s;    } }int Isempty(stack *s){    return s->next == NULL;//判断栈是否为空,为空返回1,否返回0 }int main() {    stack *s;    s = createstack(s);    int n = Isempty(s);    printf("%d",n);}

输出结果:这里写图片描述
(2)、push(入栈 )(因为是动态申请内存,不用判断是否满栈)

void push(int num,stack *s){   //将num压入栈     stack *p = (stack*)malloc(sizeof(stack));    p->data = num;    p->next = s->next;    s->next = p;  }

(3)、从栈弹出元素(pop)并返回栈顶元素

 int pop(stack *s){    //删除并返回栈顶元素     stack *p;    int temp;    if(Isempty(s))    {        printf("栈空!\n");        return 0;    }    else    {        p = s->next;        s->next = p->next;        temp = p->data;        free(p);        return temp;    }} 

链表实现的完整代码:

#include <stdio.h>#include <stdlib.h> typedef struct Node{    int data;    struct Node * next;}stack;stack *createstack(stack *s){    s = (stack *)malloc(sizeof(struct Node));    if(s == NULL)    {        printf("no space!\n");        return NULL;    }    else    {        s->next = NULL;        return s;    } }int Isempty(stack *s){    return s->next == NULL;//判断栈是否为空,为空返回1,否返回0 }void push(int num,stack *s){   //将num压入栈     stack *p = (stack*)malloc(sizeof(stack));    p->data = num;    p->next = s->next;    s->next = p;  } int pop(stack *s){    //删除并返回栈顶元素     stack *p;    int temp;    if(Isempty(s))    {        printf("栈空!\n");        return 0;    }    else    {        p = s->next;        s->next = p->next;        temp = p->data;        free(p);        return temp;    }} int main() {    stack *s;int num;    s = createstack(s);    int n = Isempty(s);    for(int i = 0;i<2;i++)    {        push(i,s);    }    for(int i = 0;i<2;i++)    {        num = pop(s);        printf("%d\t",num);    }}

运行结果:
这里写图片描述

原创粉丝点击