您的位置:首页 > 其它

顺序栈与链栈的简单应用

2016-09-26 20:35 183 查看
1. 课本P57例3.4 判断一个字符串是否是对称串

源代码:

#include <stdio.h>
#include <string.h>
#include <malloc.h>
#define MaxSize 1000
typedef char Elemtype;
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 Push(SqStack *&s,Elemtype e)
{
if(s->top==MaxSize-1)
return false;
s->top++;
s->data[s->top]=e;
return true;
}
bool Pop(SqStack *&s,Elemtype &e)
{
if(s->top==-1)
return false;
e=s->data[s->top];
s->top--;
return true;
}
bool symmetry(Elemtype a[])
{
int i;
SqStack *s;
Elemtype e;
InitStack(s);
for(i=0;a[i]!='\0';i++)
Push(s,a[i]);
for(i=0;a[i]!='\0';i++)
{
Pop(s,e);
if(a[i]!=e)
{
DestroyStack(s);
return false;
}
}
DestroyStack(s);
return true;
}
int main()
{
SqStack *s;
Elemtype a[1000];
InitStack(s);
while(gets(a))                        //多组输入字符串
{
if(symmetry(a))
printf("该字符串是对称串\n");
else
printf("该字符串不是对称串\n");
}
return 0;
}


程序截图:



2. 课本P70例3.5 判断输入表达式中的括号是否配对(假设只含有左右圆括号)

源代码:

#include <stdio.h>
#include <malloc.h>
#include <string.h>
typedef char Elemtype;
typedef struct node
{
int data;
struct node *next;
} LiStack;
void InitStack(LiStack *&l)
{
l=(LiStack *)malloc(sizeof(LiStack));
l->next=NULL;
}
void DestroyStack(LiStack *&l)
{
LiStack *pre=l,*p=l->next;
while(p!=NULL)
{
free(pre);
pre=p;
p=pre->next;
}
free(pre);
}
bool StackEmpty(LiStack *l)
{
return (l->next==NULL);
}
void Push(LiStack *&l,Elemtype e)
{
LiStack *p;
p=(LiStack *)malloc(sizeof(LiStack));
p->data=e;
p->next=l->next;
l->next=p;
}
bool Pop(LiStack *&l,Elemtype &e)
{
LiStack *p;
if(l->next==NULL)
return false;
p=l->next;
e=p->data;
l->next=p->next;
free(p);
return true;
}
bool GetTop(LiStack *l,Elemtype &e)
{
if(l->next==NULL)
return false;
e=l->next->data;
return true;
}
bool match(Elemtype exp[],int n)
{
int i=0;
char e;
bool match=true;
LiStack *st;
InitStack(st);                //初始化栈
while(i<n && match)           //扫描exp中的所有字符
{
if(exp[i]=='(')           //当前字符为左括号,进栈
Push(st,exp[i]);
else if(exp[i]==')')      //当前字符为右括号
{
if(GetTop(st,e)==true)//能够取出栈顶元素
{
if(e!='(')        //栈顶元素不为'('时表示不匹配
match=false;
else              //匹配,将栈顶元素出栈
Pop(st,e);
}
else
match=false;      //无法取出栈顶元素,表示不匹配
}
i++;
}
if(!StackEmpty(st))           //最后栈不空时,表示不匹配
match=false;
DestroyStack(st);             //销毁栈
return match;
}
int main()
{
Elemtype a[1000];
int n;
while(gets(a))
{
n=strlen(a);
if(match(a,n))
printf("输入的表达式括号配对!\n");
else
printf("输入的表达式括号不配对!\n");
}
return 0;
}


程序截图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: