有关栈和队列的练习题。

这篇博客主要介绍了两个栈的应用题目:一是利用栈解决括号匹配问题;二是设计一个栈,除了基本的Push和Pop操作外,还能在O(1)时间复杂度内获取栈中的最小元素。

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

今天继续来练习栈与队列。

1.用栈来实现括号匹配问题。

#pragma once
#include<stdio.h>
#include<assert.h>
#include<string.h>
#include<Windows.h>

typedef int DataType;
typedef struct Stack{              //定义栈的结构体
	DataType array[100];
	int top;
} Stack;

Stack s;
void StackInit(Stack *s)        //初始化栈。
{
	assert(s);
	s->top=0;
}

void StackPush(Stack *s,DataType x)  //入栈
{
	assert(s);
	if(s->top>=100)
	{
		printf("It is full\n");
	}
	else{
		s->array[s->top++]=x;
	}
}

void StackPop(Stack *s)            //出栈
{
	assert(s);
	s->top--;
}

//1为空
//0为不空
int StackIsEmpty(Stack *s)     //判断栈是否为空。
{
	assert(s);
	return s->top==0?1:0;
}

int StackTop(Stack *s)            //求栈顶元素。
{
	assert(s);
	return s->array[s->top-1];
}

void Kuohaopipei(Stack *s,const char *str)    //括号匹配。
{
	char ch;
	const char *p=str;
	StackInit(s);

	while(*p!='\0'){                   //当字符串不为'\0'时进行循环。
		switch(*p)
		{
		case '(':
		case '[':
		case '{':
			StackPush(s,*p);            //当为左括号时,入栈。
			break;
		case ')':
		case ']':
		case '}':
			if(StackIsEmpty(s)==1)         //右括号时,先判断栈是否为空,为空证明右括号比左括号多。
			{
				printf("右括号比左括号多\n");
				return;
			}
			ch=StackTop(s);                    //令ch为栈顶元素。

			if (((ch == '(' && *p == ')')           //如果栈顶元素与输入的字符相等则出栈。
				|| (ch == '[' && *p == ']')
				|| (ch == '{' && *p== '}'))) {
				StackPop(s);
			}
			else{
			printf("左右括号不匹配\n");          //否则就是不匹配。
			return;
			}
			break;
		}
		p++;                           //向后移一个字符。
	}
	if(StackIsEmpty(s)==0)             //在判断栈是否为空。若不为空,证明左括号比右括号多。
	{
		printf("左括号比右括号多\n"); 
		return; 
	}
	else{
	printf("左右括号匹配\n");          //否则匹配。
	}
}

int main()                                 
{
	Kuohaopipei(&s,"(())abc{[(])}");   //调用匹配函数。
	Kuohaopipei(&s,"(())){[]}");
	Kuohaopipei(&s,"(()(){[]}");
	Kuohaopipei(&s,"(()){[]()}");
	system("pause");
	return 0;
}

2. 实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值)的时间复杂度为O(1)。

typedef int DataType
typedef struct Stack{
	DataType *array[100];
	int top;
}Stack;

int StackMin(Stack *s,DataType x[10])
{
	int i=0;
	DataType m=x[i];                            //临时变量,用来存放最小值。
	int n;
	s->top=0;                              // 初始化。
	assert(s);
	while(i<10){                           //循环
	if(s->top>=100)                        //判断是否满了。
	{
		printf("It is full\n");
	}
	else{
		if(x[i]<m){            //如果要入栈的值小于栈顶。
		s->array[s->top]=x[i];                //先将它入栈,在将他赋给m。
		m=x[i];
		s->top++;
		i++;
		}
		else{
			s->array[s->top]=x[i];            //否则,只入栈,不给m赋值。
			s->top++;
			i++;
		}
	}    
	                                        //循环出来,此时m的值就是最小值。

	printf("Do you want to delect?\n");     //输入值确定你是否要出栈。
	scanf("%d",&n); 
	if(n==1)                                //如果为1,则出栈。
	{
		s->top--;
	}
	return m;                               //返回最小值。
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值