今天继续来练习栈与队列。
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; //返回最小值。
}