使用堆栈存储模型(后进先出)来挂载链表数据

/***************************************************
 * 文件名:ListStack
 * 文件描述:使用堆栈存储模型(后进先出)来挂载链表数据
 *         头部插入链表方式相当于堆栈模型的存储模式
 * 编辑人:王廷云
 * 编辑日期:2017-11-12
 * 修改日期:2018-2-1
***************************************************/

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

/* 数据节点封装 */
struct node
{
	char data;
	struct node *next;
} stackHead = {.next = NULL};

/* 栈模型函数 */
void push(char data);               // 压栈
int pop(void);                      // 出栈
int top(void);                      // 栈顶
int isEmptyStack(void);             // 栈空
int isFullStack(void);              // 栈满

/* 括号匹配检查函数 */
void check(char left, char right);  

int main(void)
{
	char buff[1024];
	int i = 0;

	printf("\n=====输入带有括号的字符串=====\n");
	scanf("%s", buff);
	
	/* 循环检查直到检查完毕 */
	while (buff[i])
	{
		switch (buff[i])
		{
			/* 左括号入栈 */
			case '(':  /* no break */
			case '[':	
			case '{':
			case '<': push(buff[i]);	   break;
			
			/* 右括号出栈检查 */
			case ')': check('(', buff[i]); break;
			case ']': check('[', buff[i]); break;
			case '}': check('{', buff[i]); break;
			case '>': check('<', buff[i]); break;
		}
		i++;
	}
	
	/* 检查完所有右括号字符后还有左括号说明不匹配 */
	while (!isEmptyStack())
	{
		printf("\'%c\'是多余的括号!\n", pop());
	}

	return 0;
}

/**
 * 函数名:push
 * 函数功能:数据节点入栈
 * 参数:data:入栈的数据
 * 返回值:void
*/
void push(char data)
{
	struct node *newOne;

	/* 分配新节点数据空间 */
	newOne = malloc(sizeof(newOne));
	if (NULL == newOne)
	{
		printf("Push data error! Maybe stack of memry is full!\n");
		exit(1);
	}
	
	/* 给新节点赋值数据 */
	newOne->data = data;
	
	/* 链表头插入节点方式模拟入栈 */	
	newOne->next = stackHead.next;
	stackHead.next = newOne;
}

/**
 * 函数名:pop
 * 函数功能:数据节点出栈
 * 参数:void
 * 返回值:栈顶数据
*/
int pop(void)
{
	struct node *topNode;
	char topData; 

	topNode = stackHead.next;			// 先保存栈顶数据地址
	topData = stackHead.next->data;		// 取栈顶数据
	
	stackHead.next = topNode->next;	// 摘掉栈顶节点
	free(topNode);

	return topData;						// 返回栈顶数据
}

/**
 * 函数名:top
 * 函数功能:获取栈顶数据
 * 参数:void
 * 返回值:栈顶数据
*/
int top(void)
{
	return stackHead.next->data;
}

/**
 * 函数名:isEmptyStack
 * 函数功能:判断栈是否为空
 * 参数:void
 * 返回值:栈为空返回1,不为空返回0
*/
int isEmptyStack(void)
{
	return stackHead.next == NULL;
}

/**
 * 函数名:isFullStack
 * 函数功能:判断栈是否已满
 * 参数:void
 * 返回值:0-链表不存在满的情况
*/
int isFullStack(void)
{
	return 0;
}

/**
 * 函数名:check
 * 函数功能:通过检查括号是否匹配
 * 参数:left: 左括号  right: 右括号 
 * 返回值:void
*/
void check(char left, char right)
{
	char temp;

	if (isEmptyStack())
	{
		printf("%c 是多余的括号\n", right);
		exit(1);
	}
	
	temp = pop();
	if (temp != left)
	{
		printf("\'%c\' 和 \'%c\' 不匹配\n",left,right);
		exit(1);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值