/*
顺序栈(数组实现)
2018.12.09
*/
#include<stdio.h>
#include<string.h>
#define MAXSIZE 10000
//顺序栈结构体定义:数据+栈顶
typedef struct
{
int data[MAXSIZE];
int top;
}SequenceStack;
//初始化顺序栈 top = -1
void initStack(SequenceStack *s)
{
s->top = -1;
}
//顺序栈判空
int isEmpty(SequenceStack s)
{
if (s.top == -1)return 1;
return 0;
}
//顺序栈入栈
void push(SequenceStack *s,int element)
{
if (s->top == MAXSIZE - 1)return 0;
(s->top)++; //此处非考试标准写法
s->data[s->top] = element;
}
//顺序栈出栈
int pop(SequenceStack *s)
{
if (s->top == -1)return 0;
int popElement;
popElement = s->data[s->top];
(s->top)--;
return popElement;
}
//打印顺序栈
void printStack(SequenceStack s)
{
printf("从栈底到栈顶的元素为:");
for (int i = 0; i <= s.top; i++)
{
printf("%d ", s.data[i]);
}
printf("\n");
}
//顺序栈应用:字符串匹配
int isBracketMatch(char *str, int strLength)
{
/*判断相等用 == 注意此处是 字符串-字符数组*/
/*【考试用】下面两句快速定义与初始化 顺序栈 考研考的多的是顺序栈*/
char stack[MAXSIZE];
int top = -1; //用两个语句完成 栈的定义与初始化
for (int i = 0; i < strLength; i++)
{
if (str[i] == '(')stack[++top] = '('; //入栈
if (str[i] == ')')
{
if (top == -1)return 0;//第一个出现 )肯定是错误的表达式,一定不匹配
else top--;
}
}
if (top == -1)return 1; //都找完,栈空,说明匹配
else return 0; //都找完,栈不空,说明不匹配
}
//顺序栈应用:进制转换
void decimialToBinary(int decimalNumber)
{
int stack[MAXSIZE]; //定义栈
int top = -1;
while (decimalNumber)
{
stack[++top] = decimalNumber % 2; //入栈
decimalNumber /= 2;
}
int temp;
printf("转换为二进制数:");
while (top != -1)
{
temp = stack[top--]; //出栈
printf("%d", temp);
}
}
int main()
{
//顺序栈--括号匹配
{
char str[MAXSIZE];
printf("\n顺序栈 字符串括号匹配\n");
printf("请输入 字符串:");
gets(str);
int strLength = strlen(str);
printf("字符串的长度为:%d\n", strLength);
if (isBracketMatch(str, strLength) == 1)printf("字符串中“()”匹配\n");
else printf("字符串中“()”不匹配\n");
}
//栈的基本操作--出入栈、栈判空
{
int num;
printf("请输入 入栈元素的个数:");
scanf("%d", &num);
SequenceStack s;
initStack(&s); //初始化栈
int element;
printf("请输入 入栈元素(空格隔开):");
for (int i = 0; i < num; i++)
{
scanf("%d", &element);
push(&s, element); //入栈
}
printStack(s);
printf("依次出栈\n");
int popElement;
for (int i = 1; i < num + 1; i++)
{
popElement = pop(&s);
printf("第 %d 个出栈的元素为:%d\n", i, popElement);
}
if (isEmpty(s))printf("此时栈空");
else printf("此时栈非空");
}
//顺序栈-进制转换
{
int decimalNumber;
printf("请输入一个十进制数:");
scanf("%d", &decimalNumber);
decimialToBinary(decimalNumber);
}
return 0;
}