16 篇文章 0 订阅
10 篇文章 0 订阅


1. 顺序栈

定义

typedef struct stack
{
	int a[20];
	int top;
}Sqstack;
初始化
Sqstack* InitStack ()
{
	Sqstack *ret = NULL;
	ret = (Sqstack*)malloc (sizeof(Sqstack));
	if (ret)
	{
		/*将栈的长度初始化为0*/ 
		ret -> top = 0;
	}
	return ret;
}
入栈

int Push(Sqstack *stack, int data)
{
	/*这里有一个复用方式,也就是顺序栈的长度和数组的下标进行复用s*/
	stack -> a[stack -> top] = data;
	stack -> top++;
	return 1;
}
出栈

int Pop (Sqstack *stack, int *data)
{
	if (stack -> top == 0)
	{
		printf ("the stack is empty\n");
		printf ("弹出已经被改变了的u的值");
	}
	else
	{	
		stack -> top--;
		*data = stack -> a[stack -> top];
	}
	return 1; 	
}
打印栈元素

void Play (Sqstack *stack)
{
	int i = 0;
	if (stack -> top == 0)
	{
		printf ("It is empty\n");
	}
	/*stack -> top,栈的长度*/
	else
	{
		for (i = 0; i < stack -> top; i++)
		{
			printf ("栈中的数据为:%d\n", stack -> a[i]);
		}
	}
}

测试

int main()
{	
	int h = 4;
	int p = 0;
	int i = 0;
	int u = 3;
	Sqstack* qq;
	
	qq = InitStack();
			
	for (i = 0; i < 5; i++)
	{
		Push (qq, i);
	}
	Play (qq);
	
	/*弹出操作*/
	Pop (qq, &u);
	printf ("弹出的元素是:%d\n",u);
	Pop (qq, &u);
	printf ("弹出的元素是:%d\n",u);
	Pop (qq, &u);
	printf ("弹出的元素是:%d\n",u);
	Pop (qq, &u);
	printf ("弹出的元素是:%d\n",u);
	Pop (qq, &u);
	printf ("弹出的元素是:%d\n",u);
	Pop (qq, &u);
	printf ("%d\n",u);

	return 1;
}


2. 链栈

#ifndef Stack_H
#define Stack_H

typedef int Item;
typedef struct node * PNode;
/*定义栈节点类型*/
typedef struct node
{
	Item data;
	PNode down;
}Node;
/*定义栈类型*/
typedef struct stack
{
	PNode top;
	int size;
}Stack;
/*构造一个空栈*/
Stack *InitStack();

/*销毁一个栈*/
void DestroyStack(Stack *ps);

/*把栈置空*/
void ClearStack(Stack *ps);

/*判定是否为空栈*/
int IsEmpty(Stack *ps);

/*返回栈大小*/
int GetSize(Stack *ps);

/*返回栈顶元素*/
PNode GetTop(Stack *ps,Item *pitem);

/*元素入栈*/
PNode Push(Stack *ps,Item item);

/*元素出栈*/
PNode Pop(Stack *ps,Item *pitem);

/*遍历栈并访问visit函数*/
void StackTraverse(Stack *ps,void (*visit)());

#endif

#include"Stack.h"
#include<malloc.h>
#include<stdlib.h>
/*构造一个空栈*/
Stack *InitStack()
{
	Stack *ps = (Stack *)malloc(sizeof(Stack));
	if(ps!=NULL)
	{
		ps->top = NULL;
		ps->size = 0;
	}
	return ps;
}

/*判定是否为空栈*/
int IsEmpty(Stack *ps)
{
	if(ps->top == NULL && ps->size == 0)
		return 1;
	else
		return 0;
}

/*返回栈大小*/
int GetSize(Stack *ps)
{
	return ps->size;
}

/*元素入栈*/
PNode Push(Stack *ps,Item item)
{
	PNode pnode = (PNode)malloc(sizeof(Node));
	if(pnode != NULL)
	{
		pnode->data = item;
		pnode->down = GetTop(ps,NULL);
		ps->size++;
		ps->top = pnode;
		
	}
	return pnode;
}

/*返回栈顶元素*/
PNode GetTop(Stack *ps,Item *pitem)
{
	if(IsEmpty(ps)!=1&&pitem!=NULL)
	{
		*pitem = ps->top->data;
	}
	return ps->top;
}


/*元素出栈*/
PNode Pop(Stack *ps,Item *pitem)
{
	PNode p = ps->top;
	if(IsEmpty(ps)!=1&&p!=NULL)
	{
		if(pitem!=NULL)
			*pitem = p->data;
		ps->size--;
		ps->top = ps->top->down;	
		free(p);
	}
	return ps->top;
}

/*销毁一个栈*/
void DestroyStack(Stack *ps)
{
	if(IsEmpty(ps)!=1)
		ClearStack(ps);
	free(ps);
}

/*把栈置空*/
void ClearStack(Stack *ps)
{
	while(IsEmpty(ps)!=1)
	{
		Pop(ps,NULL);
	}
}

/*遍历栈并访问visit函数 */
void StackTraverse(Stack *ps,void (*visit)())
{
	PNode p = ps->top;
	int i = ps->size;
	while(i--)
	{
		visit(p->data);
		p = p->down;
	}
}

#include"Stack.h"
#include<stdio.h>
void print(Item i)
{
	printf("该节点元素为%d\n",i);
}
main()
{
	Stack *ps = InitStack();
	int i,item;

	printf("0-9依次入栈并输出如下:\n");
	for(i=0;i<10;i++)
	{
		Push(ps,i);
		GetTop(ps,&item);
		printf("%d ",item);
	}
	
	printf("\n从栈顶到栈顶遍历并对每个元素执行print函数:\n");
	StackTraverse(ps,print);

	printf("栈中元素依次出栈并输出如下:\n");
	for(i=0;i<10;i++)
	{
		Pop(ps,&item);
		printf("%d ",item);
	}
	
	ClearStack(ps);
	if(IsEmpty(ps))
		printf("\n将栈置空成功\n");
	DestroyStack(ps);
	printf("栈已被销毁\n");
		
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[1\]提供了一个朴素的解法,使用两个来存储字符串,一个用来存储普通字符,另一个用来存储特殊字符。遍历字符串,如果是普通字符则压入第一个,如果是特殊字符则弹出第一个顶元素。最后比较两个是否相同即可判断字符串是否有效。这个解法的时间复杂度是O(M + N),空间复杂度也是O(M + N)。\[1\] 引用\[2\]提供了另一个的应用场景,即判断括号是否有效。遍历字符串,如果是左括号则压入,如果是右括号则判断和顶元素是否匹配,不匹配则返回false,匹配则弹出顶元素。最后判断是否为空即可判断括号是否有效。\[2\] 引用\[3\]也提供了一个判断括号是否有效的解法,使用来操作。遍历字符串,如果是左括号则压入,如果是右括号则判断和顶元素是否匹配,不匹配则返回false,匹配则弹出顶元素。最后判断是否为空即可判断括号是否有效。这个解法使用了HashMap来存储括号的对应关系。\[3\] 综上所述,在解决字符串相关问题中有着广泛的应用,包括判断字符串是否有效、逆波兰表达式等。在解决这些问题时,可以帮助我们保存和处理字符的顺序,从而简化问题的处理过程。 #### 引用[.reference_title] - *1* *3* [Leetcode刷题03-](https://blog.csdn.net/weixin_47802917/article/details/123007699)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v4^insert_chatgpt"}} ] [.reference_item] - *2* [leetCode-类型详解](https://blog.csdn.net/zhiyikeji/article/details/125508011)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v4^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值