数据结构第三章栈和队列(一)

博客提及了栈相关的经典问题,包括迷宫求解、表达式求值、栈与递归实现、汉诺塔、马踏棋盘、八皇后等问题,还表示后续会单独列出讲解,队列问题之后再谈。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//数据结构 第三章栈和队列
#include<stdio.h>
#include<stdlib.h>
#define OVERFLOW -2
#define FALSE 0
#define TRUE 1
#define OK 1
#define ERROR 0
typedef int Status;
//栈的顺序存储表示

#define STACK_INIT_SIZE 100 //存储空间的初始分配量
#define STACKINCREAMENT 10  //存储空间分配增量

typedef char SElemType;
typedef struct
{
	SElemType *base;  //构造之前和销毁之后base的值为NULL
	SElemType *top;   //栈顶指针
	int stacksize;    //当前已分配的存储空间
}SqStack;
//基本操作的函数原型声明

//构造一个空栈
Status InitStack(SqStack *S);

//销毁栈S
Status DestroyStack(SqStack *S);

//把S置为空栈
Status ClearStack(SqStack *S);

//若栈为空栈返回TRUE
Status StackEmpty(SqStack S);

//返回栈的长度
int StackLength(SqStack S);

//返回栈顶元素
Status GetTop(SqStack S,SElemType *e);

//入栈
Status Push(SqStack *S,SElemType e);

//出栈
Status Pop(SqStack *S,SElemType *e);

//遍历栈
Status StackTraverse(SqStack S,Status( *visit)());

Status InitStack(SqStack *S)
{
	S->base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
	if(!S->base) exit(OVERFLOW);//存储分配失败
	S->top=S->base;
	S->stacksize=STACK_INIT_SIZE;
	return OK;
}
Status GetTop(SqStack S,SElemType *e)
{
	if(S.top==S.base) return ERROR;
	*e=*(S.top-1);
	return OK;
}
Status Push(SqStack *S,SElemType e)
{
	if(S->top-S->base>=S->stacksize)//栈满,追加存储空间
	{
		S->base=(SElemType *)realloc(S->base,(S->stacksize+STACKINCREAMENT)*sizeof(SElemType));
		if(!S->base) exit(OVERFLOW);
		S->top=S->base+S->stacksize;
		S->stacksize+=STACKINCREAMENT;
	}
	//入栈操作,完成操作后,top指针加1
	*S->top++=e;
	return OK;
}
Status Pop(SqStack *S,SElemType *e)
{
	if(S->base==S->top) return ERROR;
	*e=*--S->top;
	return OK;
}
Status StackEmpty(SqStack S)
{
	if(S.base==S.top)
	{
		return TRUE;
	}
	else
	{
		return FALSE;
	}
}
Status ClearStack(SqStack *S)
{
	S->top=S->base;
	return OK;
}
Status DestroyStack(SqStack *S)
{
	S->base=NULL;
	return OK;
}
//栈的应用举例,数制转转
void conversion(SqStack *S)
{
	//对于输入的任意一个非负十进制整数,打印输出其八进制数
	SElemType quotient;
	int N;
	InitStack(S);
	scanf("%d",&N);
	while(N)
	{
		Push(S,N%8);
		N=N/8;
	}
	while(!StackEmpty(*S))
	{
		Pop(S,&quotient);
		printf("%d",quotient);
	}
}
//行编辑程序
//如果从终端接收的一个字符既不是退格符也不是退行符,则将该字符入栈
//如果是一个退格符,则从栈顶删除一个字符,如果是一个退行符则将字符栈清空

void LineEdit(SqStack *S)
{
	char ch,c;
	ch=getchar();
	InitStack(S);
	while(ch!=EOF)
	{
		while(ch!=EOF && ch!='\n')
		{
			switch(ch)
			{
			case '#':Pop(S,&c); break;
			case '@':ClearStack(S); break;
			default:Push(S,ch); break;
			}
		
			ch=getchar();//从终端接收下一个字符
		}
	
	//将从栈底到栈顶的字符传送至调用过程的数据区
	ClearStack(S);//重置栈为空
	if(ch!=EOF) ch=getchar();
	}
	DestroyStack(S);
}

以下还有迷宫求解问题,表达式求值问题(计算器的核心原理)
栈与递归的实现,汉诺塔问题,马踏棋盘问题,八皇后问题等。
以后再单独列出来将,队列下一步再说。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值