zoukankan      html  css  js  c++  java
  • 堆和栈

    堆和栈

    Stack(栈)

    栈的结构:

    下面是数据结构的集中类型:

    struct stu   //链表
    {
    	int data;  //抽象出的一种数据
    
    	struct stu *pnext;   //链表的指针
    };
    
    struct    //顺序表
    {
    	int data[100];
    
    	int size;    //顺序表大小标志
    };
    
    struct  //顺序结构的栈
    {
    	int data[100];
    
    	int top;	//栈顶标志
    };
    
    

    顺序结构的栈:

    
    #include <stdio.h>
    
    #define MAXSIZE 100
    
    typedef struct  //顺序结构的栈
    {
    	int data[MAXSIZE];
    	int top;	//栈顶标志
    
    }SeqStack;
    
    void StackInit(SeqStack *S);  //初始化
    int StackPush(SeqStack *S, int data);//入栈
    int StackPop(SeqStack *S,int *data);//出栈
    
    int main()
    {
    	int data;
    	SeqStack myStack;	//定义一个变量
    
    	StackInit(&myStack); //初始化栈
    
    	for (int i = 0; i < 10; i++)
    	{
    		StackPush(&myStack, i+1);
    		printf("%d	", myStack.data[i]);
    	}
    
    	for (int i = 0; i < 10; i++)
    	{
    		StackPop(&myStack, &data);
    		printf("%d	", data);
    	}
    	return 0;
    }
    
    //初始化
    void StackInit(SeqStack *S)
    {
    	S->top = 0;
    }
    
    //入栈
    int StackPush(SeqStack *S, int data)
    {
    	if (S->top >= MAXSIZE)  //判断栈是否满
    	{
    		printf("栈满!
    ");
    		return 0;
    	}
    	else
    	{
    		S->data[S->top] = data;  //往栈顶加入数据
    		S->top++;
    		return 1;
    	}
    }
    
    //出栈  不是要删除  而是得到
    int StackPop(SeqStack *S,int *data)
    {
    	if (S->top <= 0)
    	{
    		printf("栈空
    ");
    		return 0;
    	}
    	else
    	{
    		S->top--;
    		*data = S->data[S->top];
    		return 1;
    	}
    }
    

    //栈顶的元素 出栈判空 入栈判满 *data = S->data[S->top-1];
    // 1 2 3 4 5 6 7 8 9 10

    链式结构的栈:

    
    //链式栈
    #include <stdio.h>
    
    typedef struct node
    {
    	int data;   
    	struct node *pnext;
    }LsNode;
    
    
    void StackInit(LsNode **head);//初始化
    void StackPush(LsNode *head, int data);  //入栈
    int StackPop(LsNode *head, int *data);	//出栈
    
    
    int main()
    {
    	int data;
    	LsNode *head;  //在主函数中定义变量的时候,系统根据变量的数据类型开辟大小。int a 4  double b 8
    				   //定义指针变量的时候必须用malloc去只指定内存的大小。
    	StackInit(&head);
    
    	for (int i = 0; i < 10; i++)
    	{
    		StackPush(head, i + 1);
    	}
    
    	for (int i = 0; i < 10; i++)
    	{
    		StackPop(head, &data);
    		printf("%d	", data);
    	}
    	return 0;
    }
    
    //初始化
    void StackInit(LsNode **head)
    {
    	*head = (LsNode *)malloc(sizeof(LsNode));
    	(*head)->pnext = NULL;  //int =NULL;
    }
    
    //入栈
    void StackPush(LsNode *head,int data)
    {
    	LsNode *p;  //从新定义一个节点
    	p = (LsNode *)malloc(sizeof(LsNode));  //为新的节点开辟空间
    	//malloc 开辟一块内存 并且返回一个空指针类型,空指针类型可以强制转换为任意其他指针类型。
    	p->data = data;							//对新节点的内容填充
    	p->pnext = head->pnext;						//新节点的pnext指向NULL
    	head->pnext = p;						//新节点的地址赋给head->pnext.
    }
    
    //出栈
    int StackPop(LsNode *head,int *data)
    {
    	LsNode *p = head->pnext;  //p指向哪里? 指向第一个元素
    	if (NULL == p)
    	{
    		printf("栈空
    ");
    		return 0;
    	}
    	else
    	{
    		head->pnext = p->pnext;     //让head->pnext指向下一个元素
    		*data = p->data;			//得到需要的第一个元素保存在data变量中
    		free(p);					//释放p指向的内存。
    		return 1;
    	}
    }
    
    

    注意:

    循环队列 队列满 头尾重合 队列的大小 size 或者num 或者count计数

    
    Typdef struct
    {
    Int data[100];
    Int front;
    Int end;
    Int count;
    }
    
    
  • 相关阅读:
    我业余时间开发的东西文本编辑器 美丽的控件
    讲讲语言转换程序:将一种语言转换为另一种语言的程序
    调整心态,正确应对所学技术的失宠?(至F#,SL的学习者们)
    开贴说说文本编辑器的那些事情捕获输入内容
    开贴说说文本编辑器的那些事情 字符串的宽度
    电话亭。
    【旅行】西湖——初秋。
    偶这个前端设计师有生以来写过的最复杂的程序业务逻辑(菜鸟贴)。
    “页面制作人员”?“页面工程师”?“页面架构师”?滚一边去!
    【旅行】生的活力——西塘正午。
  • 原文地址:https://www.cnblogs.com/qzdd/p/12354347.html
Copyright © 2011-2022 走看看