栈(stack)的基本操作—出栈、遍历,数组栈…C语言代码表示

2022-07-1712:07:55数据结构与算法Comments1,167 views字数 1925阅读模式

1. 栈的基本操作—出栈文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/25087.html

如图:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/25087.html

栈(stack)的基本操作—出栈、遍历,数组栈…C语言代码表示文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/25087.html

出栈(pop)操作,是在栈不为空的情况下(注意一定要进行判空操作),将栈顶的元素删除,同时top指针,next向下进行移动即可的操作。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/25087.html

其代码可以表示为:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/25087.html

//出栈 pop
Link_Stack *Pop_stack(Link_Stack *p)
{
    Node *temp;
    temp = p->top;
    if (p->top == NULL)
    {
        printf("错误:栈为空");
        return p;
    }
    else
    {
        p->top = p->top->next;
        free(temp);
        //delete temp;
        p->count--;
        return p;
    }
}


2. 栈的基本操作—遍历
文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/25087.html

栈的遍历相对而言比较复杂,由于栈的特殊性质,其只允许在一端进行操作,所以我们的遍历操作永远都是逆序的,其过程为,在栈不为空的情况下,一次从栈顶元素向下访问,直到指针指向空(即到栈尾)为结束。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/25087.html

其代码可以表示为:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/25087.html

//遍历栈:输出栈中所有元素
int show_stack(Link_Stack *p)
{
    Node *temp;
    temp = p->top;
    if (p->top == NULL)
    {
        printf("");
        printf("错误:栈为空");
        return 0;
    }
    while (temp != NULL)
    {
        printf("%d\t", temp->data);
        temp = temp->next;
    }
    printf("\n");
    return 0;
}

3. 快速栈实现--数组栈文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/25087.html

数组栈是一种更为快速的模拟实现栈的方法,所谓模拟,就是不采用真实的链表设计,转而采用数组的方式进行“模拟操作”,这是一种仿真类型的操作,其可以快速的帮助我们构建代码,分析过程,相应的实现起来也更加的便捷。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/25087.html

其代码如下(请参考上文进行自主分析):文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/25087.html

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define maxn 10000
 
//结点设计
typedef struct stack{
    int data[maxn];
    int top;
}stack;
 
//创建
stack *init(){
    stack *s=(stack *)malloc(sizeof(stack));
    if(s==NULL){
        printf("分配内存空间失败");
        exit(0);
    }
    memset(s->data,0,sizeof(s->data));
    //memset操作来自于库文件string.h,其表示将整个空间进行初始化
    //不理解可以查阅百度百科https://baike.baidu.com/item/memset/4747579?fr=aladdin
    s->top=0;     //栈的top和bottom均为0(表示为空)
    return s;
}
 
//入栈push
void push(stack *s,int data){
    s->data[s->top]=data;
    s->top++;
}
 
//出栈pop
void pop(stack *s){
    if(s->top!=0){
        s->data[s->top]=0;  //让其回归0模拟表示未初始化即可
        s->top--;
    }
}
 
//模拟打印栈中元素
void print_stack(stack *s){
    for(int n=s->top-1;n>=0;n--){
        printf("%d\t",s->data[n]);
    }
    printf("\n");   //习惯性换行
}
 
int main(){
    stack *s=init();
    int input[5]={11,22,33,44,55};  //模拟五个输入数据
    for(int i=0;i<5;i++){
        push(s,input[i]);
    }
    print_stack(s);
    /////////////
    pop(s);
    print_stack(s);
    return 0;
}
文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/25087.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/suanfa/25087.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定