• 顺序栈用C语言实现


    从数据结构的角度看,栈和队列也是线性表,其特殊性在于栈和队列的基本操作是线性表操作的子集,它们是操作受限的线性表;

    但从数据类型角度来看,它们是和线性表大不相同的两种重要的抽象数据类型。

    顺序栈,即栈的顺序存储结构是用一组地址连续的存储单元依次存放自栈顶到栈顶的数据元素
    typedef struct
    {
        int * base;   //栈底指针,在栈构造之前和摧毁之后,base的值为NULL
        int * top;    //栈顶指针,在非空栈始终指向栈顶元素的下一个位置
        int stacksize;    //当前已分配的存储空间
    } SqStack;
    

    base栈底指针:始终指向栈底位置,若base=NULL,则栈不存在

    top栈顶指针:非空栈中的栈顶指针始终指向栈顶元素的下一个位置

    注意顺序栈的栈底也是存放数据的。
    /*
    	2016年10月28日20:46:25
    	静态栈
    */
    #include<stdio.h>
    #include<malloc.h>
    #include<stdlib.h>
    
    #define STACK_INIT_SIZE  100     //存储空间初始分配量
    #define SRAKINCRMENT     10      //存储空间分配增量
    
    typedef struct
    {
    	int * base;   //栈底指针,在栈构造之前和摧毁之后,base的值为NULL
    	int * top;    //栈顶指针,在非空栈始终指向栈顶元素的下一个位置
    	int stacksize;    //当前已分配的存储空间
    } SqStack;
    
    //函数声明
    void InitStack(SqStack * S);
    void Push(SqStack * S, int e);
    void StackTraverse(SqStack * S);
    bool Pop(SqStack * S, int * e);
    
    int main(void)
    {
    	SqStack S;
    	int val;
    	
    	InitStack(&S);
    	
    	Push(&S,1);
    	Push(&S,2);
    	Push(&S,3);
    	Push(&S,4);
    	StackTraverse(&S);
    	printf("
    ");
    	
    	Pop(&S, &val);
    	Pop(&S, &val);
    	StackTraverse(&S);
    	
    	return 0;
    }
    
    void InitStack(SqStack * S)    //初始化静态栈
    {
    	S->base = (int *)malloc(STACK_INIT_SIZE * sizeof(int));
    	if(NULL == S->base)
    	{
    		printf("内存分配失败,程序终止!
    ");
    		exit(-1);
    	}
    	
    	S->top = S->base;
    	S->stacksize = STACK_INIT_SIZE;
    	
    	return;
    }
    
    void Push(SqStack * S, int e)    //压栈
    {
    	if( (S->top - S->base) >= S->stacksize)   //如果栈满
    	{
    		S->base = (int *)realloc(S->base, (S->stacksize + SRAKINCRMENT ) * sizeof(int));   
    		if(NULL == S->base)
    		{
    			printf("内存分配失败,程序终止!
    ");
    			exit(-1);
    		}
    		
    		S->top = S->base + S->stacksize;
    		S->stacksize += SRAKINCRMENT;
    	}
    	
    	*(S->top) = e;
    	++(S->top);
    	
    	return;
    }
    
    void StackTraverse(SqStack * S)    //遍历输出,从栈顶开始遍历
    {
    	int * p = S->top;
    	
    	while( S->base != p)
    	{
    		printf("%d
    ",*(p-1));
    		--p;
    	}
    	
    	return;
    }
    
    bool Pop(SqStack * S, int * e)   //出栈
    {
    	if(S->base == S->top)   //如果空
    	{
    		return false;
    	}
    	
    	*e = *(S->top);
    	--(S->top);
    	
    	return true;
    }
    
     
  • 相关阅读:
    leetcode 190 Reverse Bits
    vs2010 单文档MFC 通过加载位图文件作为客户区背景
    leetcode 198 House Robber
    记忆化搜索(DP+DFS) URAL 1183 Brackets Sequence
    逆序数2 HDOJ 1394 Minimum Inversion Number
    矩阵连乘积 ZOJ 1276 Optimal Array Multiplication Sequence
    递推DP URAL 1586 Threeprime Numbers
    递推DP URAL 1167 Bicolored Horses
    递推DP URAL 1017 Staircases
    01背包 URAL 1073 Square Country
  • 原文地址:https://www.cnblogs.com/yzy-blogs/p/6011708.html
Copyright © 2020-2023  润新知