#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct node
{
int *base;
int *top;
int size;
} stack;
void initstack(stack *s)//初始化栈
{
int n;
printf("请输入你要创建的栈大小:");
scanf("%d",&n);
s->base = (int *)malloc(n*sizeof(int));
s->top = s->base;
s->size = n;
printf("创建成功!\n");
}
void MenuList()
{
printf("\n\n**************************\n");
printf(" 1 ------- 初始化栈\n");
printf(" 2 ------- 生成栈La\n");
printf(" 3 ------- 打印栈顶元素\n");
printf(" 4 ------- 入栈 \n");
printf(" 5 ------- 出栈 \n");
printf(" 6 ------- 数制转换 \n");
printf(" 7 ------- 判断回文 \n");
printf(" 8 ------- 括号匹配 \n");
printf("**************************\n");
}
int push(stack *s,int i)//入栈
{ if(s->top-s->base==s->size)
return 0;
*s->top = i;
s->top++;
return 1;
}
int pushc(stack *s,char c)//入栈
{ if(s->top-s->base==s->size)
return 0;
*s->top = c;
s->top++;//始终指向栈顶元素的下一位置
return 1;
}
int pop(stack *s)//出栈
{
int e;
if(s->top!=s->base){
s->top--;
e=*(s->top);
return e;
}
else
return 0;
}
char popc(stack *s)//出栈
{
char c;
if(s->top!=s->base){
s->top--;
c=*(s->top);
return c;
}
else
return '0';
}
int gettop(stack *s)//获取栈顶元素
{
int e;
if(s->top==s->base)
return 0; //栈空
e=*(s->top-1); //栈非空,将栈顶元素送往e单元保存,栈s保持不变
return e;
}
void empty(stack *s)//清空栈
{
s->top==s->base;
}
int stackempty(stack *s)//判空
{
if ( s->top==s->base ) /* 栈空 */
return 1;
return 0;
}
void Decimal_Binary () {//进制转换
int N, r;
stack S; //定义栈结构S
initstack(&S); //初始化栈S
printf("请输入要转换的数:");
scanf("%d", &N); //输入十进制正整数
printf("请输入要转换的进制:");
scanf("%d", &r); //输入 正整数r (进制)
while (N > 0) {
push(&S, N % r); //余数入栈
N /= r; //被除数除以r,得到新的被除数
}
printf("转换后的结果为:");
while (!stackempty(&S))
{
//依次从栈中弹出每一个余数,并输出之
N=pop(&S);
printf("%d", N);
}
}
int huiwen() {//判断回文
stack L;
int s_length;
initstack(&L);
char s[20];
char c1, c2;
printf("请输入想要判断的字符串:");
scanf("%s", &s);
s_length = strlen(s); //取得要判断的字符串长度
//printf("%d",s_length);
//进栈操作
for (int k = 1; k <= s_length / 2; k++) {
push(&L, s[k - 1]);
}
if (s_length % 2 == 0) //判断字符串长度是奇数还是偶数
{
for (int i = 1; i <= s_length / 2; i++) {
c1 = pop(&L);
c2 = s[s_length / 2 + i - 1];
if (c1 == c2) //进行判断
{
continue;
} else {
printf("Wrong!");
return 0;
}
}
printf("Right!");
} else {
for (int j = 1; j <= s_length / 2; j++) {
c1 = pop(&L);
c2 = s[s_length / 2 + j];
if (c1 == c2)//进行判断
{
continue;
} else {
printf("Wrong!");
return 0;
}
}
printf("Right!");
}
}
int Check( )//括号匹配
{ stack S; //定义栈结构S
char ch;
initstack(&S); //初始化栈S
printf("请输入一串字符:");
getchar();
ch=getchar();
while (ch!='\n') {
//以字符序列的形式输入表达式
if (ch == '(' || ch == '[' || ch == '{')
pushc(&S, ch); //遇左括号入栈
//下面是遇右括号的情况(三种)
else if (ch == ')')
if (stackempty(&S))
return 0;
else {
ch = popc(&S);
if (ch != '(')
return 0;
}
else if (ch == ']')
if (stackempty(&S))
return 0;
else {
ch = popc(&S);
if (ch != '[')
return 0;
}
else if (ch == '}')
if (stackempty(&S))
return 0;
else {
ch = popc(&S);
if (ch != '{')
return 0;
}
else if(ch != '(' || ch != '[' || ch != '{')
return 0;
else
continue;
ch = getchar();
}
if ( stackempty(&S) )
return 1;
else
return 0;
}
int main()
{
stack s;
int i=100,x,m,j,a;
while(i!=0) {
MenuList();
printf("请输入选择:");
scanf("%d", &i);
if (i == 1)
initstack(&s);
if (i == 2) {
printf("请输入栈中元素个数:");
scanf("%d", &m);
for(j = 0; j < m;j++) {
printf("请输入入栈元素值(整数):");
scanf("%d",&x);
a = push(&s, x);
if (a == 0) {
printf("栈已满\n");
break;
}
}
}
if (i == 3) {
a = gettop(&s);
printf("%d\n", a);
}
if (i == 4) {
printf("请输入入栈元素值(整数):");
scanf("%d", &x);
push(&s, x);
}
if (i == 5) {
printf("出栈的顺序是:");
while (s.top != s.base) {
a = pop(&s);
printf("%d ", a);
}
printf("\n");
}
if(i==6){
Decimal_Binary ();
}
if(i==7)
huiwen();
if(i==8){
a=Check( );
if(a==1)
printf("匹配成功!");
else
printf("匹配失败!");
}
}
}
代码--栈
于 2022-08-15 18:39:51 首次发布