链式栈的基本操作与实现

1:头文件:SqStack.h

#include<stdio.h>
#include<stdlib.h>
#define ElemType int
#define STACK_SIZE 100
#define ADD_SIZE 10

typedef struct SqStack
{
	ElemType *base;
	ElemType *top;
	int stacksize;
}SqStack;

bool Isempty(SqStack *s); //栈是否为空
bool IsFull(SqStack *s);  //判栈是否已满
void InitStack(SqStack *s);  //初始化栈
void PushStack(SqStack *s,ElemType x);  //入栈
void PopStack(SqStack *s,ElemType *x);  //出栈
void ShowStack(SqStack *s); //显示栈
void GetTop(SqStack *s,ElemType *x);//获取栈顶数据
void ClearStack(SqStack *s);  //清理栈
void DestoryStack(SqStack *s); //摧毁栈
void Show();     //显示菜单

2:功能实现文件SqStack.cpp

#include"SqStack.h"

void Show()
{
	printf("***************************************\n");
	printf("* [1]:入栈            [2]:出栈        *\n");
	printf("* [3]:显示栈          [4]:获取栈顶数据*\n");
	printf("* [5]:摧毁栈          [6]:清理栈      *\n");
	printf("* [0]:结束程序                        *\n");
	printf("***************************************\n");
	printf("请选择:");
}

void InitStack(SqStack *s)
{
	s->base=(ElemType*)malloc(STACK_SIZE*sizeof(ElemType));
	if(s->base==NULL)
	{
		printf("开辟空间失败\n");
		return ;
	}
	s->top=s->base;
	s->stacksize=STACK_SIZE;
}

bool IsFull(SqStack *s)
{
	return s->top-s->base>=s->stacksize;
}

bool Isempty(SqStack *s)
{
	return s->base==s->top;
}
void PushStack(SqStack *s,ElemType x)
{
	if(IsFull(s))
	{
		s->base=(ElemType*)realloc(s->base,(s->stacksize+ADD_SIZE)*sizeof(ElemType));

		if(s->base==NULL)
		{
			printf("增加空间失败\n");
			return;
		}
		s->top=s->base+s->stacksize;
		s->stacksize+=ADD_SIZE;
	}
	*s->top=x;
	s->top++;
}

void PopStack(SqStack *s,ElemType *x)
{
	if(Isempty(s))
	{
		printf("栈为空,不能出栈\n");
		return;
	}
	s->top--;
	*x=*s->top;
}

void GetTop(SqStack *s,ElemType *x)
{
	if(Isempty(s))
	{
		printf("栈为空,不能获取栈数据\n");
		return;
	}
	*x=*(s->top-1);
}

void ClearStack(SqStack *s)
{
	s->base=s->top=NULL;
	s->stacksize=0;
}
void DestoryStack(SqStack *s)
{
	free(s->base);
	ClearStack(s);
}
void ShowStack(SqStack *s)
{
	ElemType *top=s->top;
	while(top!=s->base)
	{
		top--;
		printf("%d ",*top);

	}
	printf("\n");
}

3:主文件main.cpp

#include"SqStack.h"

void main()
{
	SqStack s;
	ElemType x;
	int pos=1;

	InitStack(&s);
	while(pos)
	{
		Show();
		scanf("%d",&pos);
		switch(pos)
		{
		case 1:
			printf("输入数据,以-1结束:");
			while(scanf("%d",&x),x!=-1)
			{
				PushStack(&s,x);
			}
			break;
		case 2:
			PopStack(&s,&x);
	        printf("出栈数据:%d\n",x);
			break;
		case 3:
			ShowStack(&s);
			break;
		case 4:
			GetTop(&s,&x);
			printf("获取栈顶数据:%d\n",x);
			break;
		case 5:
			DestoryStack(&s);
			printf("栈已被摧毁\n");
			break;
		case 6:
			ClearStack(&s);
			printf("栈已被清理\n");
			break;
		default:
			break;
		case 0:	return;
		}
	}
}

时间: 2024-10-13 18:20:08

链式栈的基本操作与实现的相关文章

&lt;二叉树的基本操作&gt;

#include<stdio.h> #include<stdlib.h> #include<string.h> #define num 100 #define OK 1 typedef int Status; typedef char DataType; typedef struct node { DataType data; struct node *lchild,*rchild; }BinTNode,*BinTree; Status CreateBiTree(Bin

iOS_UITextField 基本操作

基本操作 UITextField *userNameTextField = [[UITextField alloc] init]; userNameTextField.frame = CGRectMake(30, 100, 220, 50); [self.window addSubview:userNameTextField]; [userNameTextField release]; // 设置样式 userNameTextField.borderStyle = UITextBorderSty

Mongodb入门系列(4)——Mongodb体系结构与客户端基本操作及注意细节

说到Mongodb的体系结构,免不了与关系型数据库做个对比.这里以MySQL为例,我们进行一些比较: 从逻辑结构上对比: MySQL层次概念 MongoDB层次概念 数据库(database) 数据库(database) 表(table) 集合(collection) 记录(row) 文档(document) 在MongoDB中没有行.列.关系的概念,集合中的文档相当于一条记录,这体现了模式自由的特点. 从数据存储结构上对比: MySQL的每个数据库存放在一个与数据库同名的文件夹中,MySQL如

Oracle的基本操作-解除用户,赋予权限

一.表的基本操作 1. 用户管理 1.1 初始状态下系统的用户 在系统用户下,执行下面的查询语句可以查看到当前系统的所有用户  select * from dba_users; 1.2 创建一个用户 SQL> create user xp identified by xp; User created. 授予连接数据库的权限:SQL> grant connect to xp; Grant succeeded. SQL> conn xp/xp;Connected. 1.3 解锁一个用户并修改

数据结构中线性表的基本操作-合并两个线性表-依照元素升序排列

#include<iostream> #include<stdlib.h> #define LIST_INIT_SIZE 10/*线性表初始长度*/ #define LIST_CREATENT 2/*每次的增量*/ typedef int ElemType; using namespace std; typedef struct SqList/*线性表的数据结构定义*/ { ElemType *elem;/*线性表基址*/ int length;/*当前线性表所含的元素个数*/ i

【华为技术】VRP平台基本操作

一.显示系统信息 <Huawei>display version 图上所示可以知道VRP平台信息,运行的版本,运行的时间 二.修改和查看设备系统时间参数 1.查看时间 <Huawei>display clock 2.修改系统日期和时间 三.进入系统视图界面 <Huawei>system-view 可以配置接口.路由协议等 四.修改设备名称 五.配置登录标语信息 [R1]header shell information "Welcome to Huawei ro

Mysql查询优化从入门到跑路(三)查询的基本操作

查询的基本操作 1.选择操作 对应的是限制条件,操作对象是二维表的行. 优化方式:选择操作下推 目的:尽量减少连接操作前的元租数,使得中间临时关系尽量少(元祖数少,连接得到的元组数就少) 好处:这样可能减少IO和CPU的消耗.节约内存空间 2.投影操作 对用的SELECT查询的目的列对象 优化方式:投影操作下推 目的:尽量减少连接操作前的列数,使得中间临时关系尽量小(选择操作是使元组的个数尽量少,投影操作是使一条元组尽量少) 好处:虽然不能减少IO(多数数据库存储方式是行存储,元组是读取的最基本

TP框架对数据库的基本操作

数据库的操作,无疑就是连接数据库,然后对数据库中的表进行各种查询,然后就是对数据的增删改的操作,一步步的讲述一下框架对数据库的操作 想要操作数据库,第一步必然是要:链接数据库 一.链接数据库 (1)找到模块文件夹中的Conf文件夹,然后进行编写config.php文件 我这里是这样的文件路径 (2)打开这个config.php文件,然后找到父类配置文件convention.php文件,将关于"数据库"的部分复制粘贴到config.php配置文件中 1 2 3 4 5 6 7 8 9 /

图形数据库Neo4J的基本操作

1.创建一个节点 1 语法:CREATE (node-name:label-name{Property1-name:Property1-Value,...Propertyn-name:Propertyn-Value}) 2 如: 3 create(江湖流派:明教{name:'张无忌',skill:'九阳真经'}) 2.为两个节点建立关系 1 语法:CREATE(node1:label1)-[relationship-name:relationship-label-name]->(node2:la