#include <malloc.h>
#include <stdio.h>
typedef char ElemType;
//----- 栈的顺序存储表示 -----
#define MaxSize 50
typedef struct
{
ElemType data[MaxSize];
int top; //栈顶指针
}SqStack;
void InitStack(SqStack *&s)
{
s=(SqStack *)malloc(sizeof(SqStack));
s->top=-1;
}
void DestroyStack(SqStack *&s)
{
free(s);
}
bool StackEmpty(SqStack *s)
{
return(s->top==-1);
}
bool Push(SqStack *&s,ElemType e)
{
if (s->top==MaxSize-1) //栈满的情况,即栈上溢出
return false;
s->top++; //栈顶指针增1
s->data[s->top]=e; //元素e放在栈顶指针处
return true;
}
bool Pop(SqStack *&s,ElemType &e)
{
if (s->top==-1) //栈为空的情况,即栈下溢出
return false;
e=s->data[s->top]; //取栈顶指针元素的元素
s->top--; //栈顶指针减1
return true;
}
bool GetTop(SqStack *s,ElemType &e)
{
if (s->top==-1) //栈为空的情况,即栈下溢出
return false;
e=s->data[s->top]; //取栈顶指针元素的元素
return true;
}
int StackLength(SqStack *s)
{
return s->top+1;
}
void DispStack(SqStack *S)
{
// printf("\n栈长为:%d",StackLength(S));
// printf("\n当前栈为:");
for(int i=0;i<StackLength(S);i++)
{
printf("%c ",S->data[i]);
}
}
实验1
编制一个满足下列要求的程序:对于输入的任意一个非负十进制数,打印输出与其等值的二进制数。(十进制 → 二进制)
void conversion ()
{
SqStack *S;
int N,e;
InitStack(S);
printf("请输入十进制数N:");
scanf ("%d",&N);
while(N)
{
Push(S, N%2);
N = N/2;
}
// DispStack(S);
printf("对应的二进制是:");
while (!StackEmpty(S))
{
Pop(S,e);
printf ("%d", e );
}
}
实验2
设计一个程序用于检测输入的符号是否匹配,如果不匹配则输出提示并退出。
匹配成功:
匹配失败:
typedef int Status;
#define TRUE 1
#define FALSE 0
Status Match_Brackets()
{
SqStack *S,*T;
InitStack(S);
InitStack(T);
char inputch,e;
int ItemNum;
printf("请输入字符个数:");
scanf("%d",&ItemNum);
printf("请输入字符:");
for(int i=0;i<=ItemNum;i++) //因为要处理回车,长度加1
{
scanf("%c",&inputch);
if(inputch != 0x0a) //0x0a是回车符
{
Push(T,inputch); //保存输入的字符
}
switch(inputch)
{
case '(':
Push(S,inputch);
break;
case '[':
Push(S,inputch);
break;
case ')':
Pop(S,e);
if(e != '(')
{
printf("'('括号不匹配");
return FALSE;
}
break;
case ']':
Pop(S,e);
if(e != '[')
{
printf("'['括号不匹配");
return FALSE;
}
break;
}
}
if(!StackEmpty(S))
{
printf("\n\n括号数量不匹配!") ;
return FALSE;
}
else
{
printf("\n\n成功匹配!");
DispStack(T);
return TRUE;
}
}
实验3
设计一个算法,用于检测给定的字符串是否为对称串。
bool symmetry(ElemType str[])
{
int i;
ElemType e;
SqStack *st;
InitStack(st); //初始化栈
for (i=0;str[i]!='\0';i++) //将串所有元素进栈
Push(st,str[i]); //元素进栈
printf("给定的串是:");
DispStack(st);
for (i=0;str[i]!='\0';i++)
{
Pop(st,e); //退栈元素e
if (str[i]!=e) //若e与当前串元素不同则不是对称串
{
DestroyStack(st);//销毁栈
return false;
}
}
DestroyStack(st); //销毁栈
return true;
}
主函数
int main(int argc, char** argv) {
//*实验内容1
conversion () ;
//*实验内容2
// Match_Brackets();
/*实验内容3
char a[10]={'a','b','c','d','e','e','d','c','b','a'};
bool result=symmetry(a);
if(result == true)
{
printf("\n\n该串是对称串");
}
else
{
printf("\n\n该串不是对称串");
}
//*/
return 0;
}