顺序栈基本操作的实现

原创 2018年04月15日 20:58:00

首先,定义一个结构体,结构体中有一个指针data,顺序栈的大小,还有一个capacuty,即相当于之前顺序链表的Max_Size,表示data这段内存中能容纳的元素个数,用于扩容。

1.初始化:给data开辟内存空间,size设为0,capacity自定义一个值,这里定义为1000;

2.销毁:释放data,并且将size与capacity置为0;

3.入栈:这里与前面学习的顺序表一样,将值直接插入size位置处,在 将size++,唯一的区别是这里如果栈是满了,进行扩容

4.扩容:这里就是按照自己的喜好,重新设置capacity的大小,再将原来data中的值倒进新开辟的这段内存,释放原来的内存,在将新内存赋给data;

5.出栈:直接size--;

6.取栈顶元素:直接将size这个位置的data取出来即可;

代码如下:

seqstack.h

#pragma once

typedef char SeqStackType;


typedef struct SeqStack {
	SeqStackType* data;
	size_t size;
	size_t capacity; //MAX_SIZE的替代品,data这段内存中能容纳的元素个数
}SeqStack;
//初始化
void SeqStackInit(SeqStack* stack);
//销毁
void SeqStackDestroy(SeqStack* stack);
//入栈
void SeqStackPush(SeqStack* stack,SeqStackType value);
//出栈
void SeqStackPop(SeqStack* stack);
//取栈顶元素
int  SeqStackTop(SeqStack* stack ,SeqStackType* value);

seqstack.c

#include <stdio.h>
#include <stdlib.h>

#include "seqstack.h"
void SeqStackInit(SeqStack* stack){
	if(stack == NULL){
		return;
	}
	stack->size = 0;
	stack->capacity = 1000;
	stack->data = (SeqStackType*)malloc(stack->capacity*sizeof(SeqStackType));
	return;
}

void SeqStackDestroy(SeqStack* stack){
	free(stack->data);
	stack->size = 0;
	stack->capacity = 0;
}
//扩容
void SeqStackReSize(SeqStack* stack){
	if(stack == NULL){
		return;
	}
	if(stack->size < stack->capacity){
		return;
	}
	//扩容策略可以按照自己的喜好来定
	stack->capacity = stack->capacity * 2 + 1;
	SeqStackType* new_ptr = (SeqStackType*)malloc(stack->capacity*sizeof(SeqStackType));
	
	size_t i = 0;
	for(i = 0; i < stack->size;i++){
		new_ptr[i] = stack->data[i];
	}
	free(stack->data);
	stack->data = new_ptr;
	return;
}

void SeqStackPush(SeqStack* stack , SeqStackType value){
	if(stack == NULL){
		//非法输入
		return;
	}
	if(stack->size >= stack->capacity){
		//扩容
		SeqStackReSize(stack);
	}
	stack->data[stack->size] = value;
	stack->size++;
	return;
}

void SeqStackPop(SeqStack* stack){
	if(stack == NULL){
		//非法输入
		return;
	}
	if(stack->size == 0){
		//空栈
		return;
	}
	stack->size--;
	return;
}

int  SeqStackTop(SeqStack* stack,SeqStackType* value){
	if(stack == NULL){
		return 0;
	}
	if(stack->size == 0){
		return 0;
	}
	*value = stack->data[stack->size-1];
	return 1;
}

test.c

#include <stdio.h>
#define TEST_HEADER printf("\n========================%s=========================\n",__FUNCTION__) 

void SeqStackPrintChar(SeqStack* stack,const char* msg){
	printf("[%s]\n",msg);
	size_t i = 0;
	for(i=0;i<stack->size;i++){
		printf("[%c] ",stack->data[i]);
	}
	printf("\n");
}
void TestInit(){
	TEST_HEADER;
	SeqStack stack;
	SeqStackInit(&stack);
	printf("size expected 0 , actual %d\n",stack.size);
	printf("capacity expected 1000,actual %d\n",stack.capacity);

}

void TestDestroy(){
	TEST_HEADER;
	SeqStack stack;
	SeqStackInit(&stack);
	SeqStackDestroy(&stack);
	printf("capacity expacted 0 ,actual %d\n",stack.capacity);
}
void TestPush(){
	TEST_HEADER;
	SeqStack stack;
	SeqStackInit(&stack);
	SeqStackPush(&stack , 'a');
	SeqStackPush(&stack , 'b');
	SeqStackPush(&stack , 'c');
	SeqStackPush(&stack , 'd');

	SeqStackPrintChar(&stack ,"入栈四个元素");
}

void TestPop(){
	TEST_HEADER;
	SeqStack stack;
	SeqStackInit(&stack);
	SeqStackPush(&stack , 'a');
	SeqStackPush(&stack , 'b');
	SeqStackPush(&stack , 'c');
	SeqStackPush(&stack , 'd');

	SeqStackPop(&stack);
	SeqStackPop(&stack);
	SeqStackPrintChar(&stack,"出栈两个元素");
	SeqStackPop(&stack);
	SeqStackPop(&stack);
	SeqStackPrintChar(&stack,"再出栈两个元素");
	SeqStackPop(&stack);
	SeqStackPrintChar(&stack ,"尝试对空栈出栈");
}
void TestTop(){
	TEST_HEADER;
	SeqStack stack;
	SeqStackInit(&stack);
	SeqStackPush(&stack , 'a');
	SeqStackPush(&stack , 'b');
	SeqStackPush(&stack , 'c');
	SeqStackPush(&stack , 'd');

	SeqStackType value;
	int ret = SeqStackTop(&stack , &value);
	printf("ret expected 1,ctual %d\n",ret);
	printf("value expected d,actual %c\n",value);
}
int main(){
	TestInit();
	TestDestroy();
	TestPush();
	TestPop();
	TestTop();
	return 0;
}



Linux应用与ubuntu基本操作

-
  • 1970年01月01日 08:00

C语言实现顺序栈的基本操作

继顺序表后再用C语言写一下顺序栈的基本操作
  • OnlyLove_KD
  • OnlyLove_KD
  • 2016-09-12 09:14:34
  • 3543

顺序栈——9种基本操作和实现(C语言)

栈是仅限定在表尾进行插入和删除操作的线性表,九种栈的基本操作;分别是构造 销毁 清空 栈长 栈顶 插入 删除 遍历。下面就是代码实现:  //头文件 #include #include #incl...
  • LiuJiuXiaoShiTou
  • LiuJiuXiaoShiTou
  • 2016-11-29 16:42:02
  • 12733

数据结构顺序栈的基本操作

  • 2010年12月09日 20:11
  • 4KB
  • 下载

顺序栈的九种基本操作和实现(数据结构C语言版清华大学严蔚敏)

栈是仅限定在表尾进行插入和删除操作的线性表,在严蔚敏版的C语言版的数据结构中共定义了九种栈的基本操作;分别是构造 销毁 清空 栈长 栈顶 插入 删除 遍历。下面就是代码实现: 头文件和宏定义(保存...
  • WLxinliang
  • WLxinliang
  • 2016-10-22 19:51:28
  • 6490

顺序栈的基本操作和实现

  • 2011年11月22日 19:31
  • 153KB
  • 下载

C++实现顺序栈的基本功能

栈是限定仅在表头进行插入和删除操作的线性表,有着先进后出的特点(FILO); 现在我来动手实现栈的基本本功能练练手; 定义栈的头文件如下: #ifndef CSTOCK_H_ #define C...
  • qinmusiyan
  • qinmusiyan
  • 2014-10-07 13:30:57
  • 9648

顺序栈基本操作

  • 2017年04月14日 14:26
  • 823B
  • 下载

基于顺序栈的基本操作的实现

顺序栈简介:栈(限定在表尾进行插入和删除操作的线性表)的顺序储存结构称为顺序栈。顺序栈本质是顺序表的简化,唯一需要确定的就是用数组的哪一端表示栈低。 文章内容:初始化栈、入栈、出栈、取栈顶、判断栈是...
  • YanMeiHe
  • YanMeiHe
  • 2017-10-15 22:37:10
  • 137

顺序栈的基本操作:初始化、进栈、出栈、读栈顶元素

顺序栈:利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时由于栈操作的特殊性,还必须附设一个位置指针top(栈顶指针)来动态地指示栈顶元素在顺序栈中的位置。通常以top=-1表示空栈。代码...
  • yanxiaolx
  • yanxiaolx
  • 2016-05-29 13:43:59
  • 7070
收藏助手
不良信息举报
您举报文章:顺序栈基本操作的实现
举报原因:
原因补充:

(最多只允许输入30个字)