顺序栈用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("\n");

	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("内存分配失败,程序终止!\n");
		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("内存分配失败,程序终止!\n");
			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\n",*(p-1));
		--p;
	}

	return;
}

bool Pop(SqStack * S, int * e)   //出栈
{
	if(S->base == S->top)   //如果空
	{
		return false;
	}

	*e = *(S->top);
	--(S->top);

	return true;
}
时间: 2024-10-24 13:41:19

顺序栈用C语言实现的相关文章

顺序栈的c语言实现

Football on Table 题意:一些杆上有人,人有一个宽度,然后现在有一个球射过去,要求出球不会碰到任何人的概率 思路:计算出每根杆的概率,之后累乘,计算杆的概率的时候,可以先把每块人的区间长度再移动过程中会覆盖多少长度累加出来,然后(1?总和/可移动距离)就是不会碰到的概率 代码: #include <stdio.h> #include <string.h> #include <math.h> const double eps = 1e-8; int t,

顺序栈(C语言版)

//SeqStack.h </pre><pre name="code" class="cpp">/* stack:Last In First Out */ //1.定义顺序栈的结构 typedef struct stack { DATA data[SIZE+1]; int top; //栈顶 }SeqStack; //2.初始化栈 SeqStack *SeqStackInit() { SeqStack *p; if(p=(SeqStack *

顺序栈的栈基本操作(C语言版)

由于现在只学了C语言所以就写这个C语言版的栈的基本操作 这里说一下 :网上和书上都有这种写法 int InitStack(SqStack &p) &p是取地址  但是这种用法好像C并不支持 ,C++才支持,所以用 C语言写就需要使用指针 代码如下: 1 #include <stdio.h> 2 #include <stdlib.h> 3 #define STACK_INIT_SIZE 100//储存空间初始分配量 4 #define STACKINCREMENT 1

数据结构(java语言描述)顺序栈的使用(两个大数相加)

利用http://www.cnblogs.com/xleer/p/5289661.html中对顺序栈以及栈的进本方法的定义,实现超过整数上限的两个数的加法计算. 算法: package stack;/********************************************************************** * @author sch ********利用栈,计算两个大数的和.大数的值超过int存储的范围******************************

C语言实现顺序栈心得

栈的构成及初始化 对于“先进后出”的顺序栈,需要控制3个量:栈元素,栈顶指针,栈容量. 栈容量即栈的最大容量,若超过会产生溢出错误.当然,必要时也可以扩充容量. 栈元素可以通过动态数组( base[] )存放.初始化时用 malloc 申请(栈容量 * 元素类型)个空间. 栈顶指针用于记录栈元素个数,始终指向栈顶元素的上一个单位(如 栈顶元素为base[3],栈顶指针为4),这样就能实现元素个数的记录.不过,栈顶指针只是一种形象化的叫法,方便起见,一般将其定义为 int 型.初始化时,栈顶指针置

【小白成长撸】--顺序栈(C语言版)

1 // 顺序栈.cpp : 定义控制台应用程序的入口点. 2 // 3 4 #include "stdafx.h"//test1.0--栈表仅限Int类型 5 #include <stdio.h> 6 7 #define true 1 8 #define false 0 9 10 typedef struct stack_type 11 { 12 int stack[100];//最大容纳100个元素 13 int top; 14 }stacktype; 15 16 in

数据结构 - 顺序栈的实行(C语言)

数据结构-顺序栈的实现 1 顺序栈的定义 既然栈是线性表的特例,那么栈的顺序存储其实也是线性表顺序存储的简化,我们简称为顺序栈.线性表是用数组来实现的,对于栈这种只能一头插入删除的线性表来说,用数组哪一端来作为栈顶和栈底比较好? 对,没错,下标为0的一端作为栈底比较好,因为首元素都存在栈底,变化最小,所以让它作栈底. 我们定义一个top变量来指示栈顶元素在数组中的位置,这top就如同中学物理学过的游标卡尺的游标,它可以来回移动,意味着栈顶的top可以变大变小,但无论如何游标不能超出尺的长度.同理

数据结构C语言—顺序栈案例—十进制转二进制

1 #include <stdio.h> 2 #include <stdlib.h> 3 #include "SeqStack.h" 4 5 void conversion(int); 6 SeqStack seq; 7 int main() 8 { 9 int n; 10 scanf("%d",&n); 11 conversion(n); 12 return 0; 13 } 14 15 void conversion(int N)

DS之顺序栈和链队实现回文判断

顺序栈和链队的基本操作就不再一一列举了,要想实现回文判断,先来了解什么是回文?"回文"一字符串正着读和反着读是相同的字符序列,如"abcba","abba"为"回文","abab"则不是"回文". 其次就是顺序栈和链队如何实现回文的判断?将输入的字符串依次入栈和入队,然后再依次出栈和出队,由于入栈和入队是相同的序列,然而出栈和出队是相反的序列,这就实现了回文的判断. 最后考虑要用到顺序栈