链式栈的操作
定义一个结点和定义栈顶和栈底
typedef struct Node
{
int data;//数据域
struct Node *pNext;//指针域
}NODE,*PNODE;
typedef struct Stack
{
PNODE top;//栈顶指针
PNODE bottom;//栈底指针
}STACK,*PSTACK;
构造一个空栈
void init(PSTACK pS)
{
pS->top = (PNODE)malloc(sizeof(PNODE));
if(pS->top==NULL)
{
printf("动态内存分配失败!\n");
exit(-1);
}
else
{
pS->bottom = pS->top;
pS->top->pNext = NULL;
}
}
入栈
void push(PSTACK pS,int val)
{
PNODE pNew=(PNODE)malloc(sizeof(PNODE));
pNew->data=val;
pNew->pNext=pS->top;
pS->top=pNew;
}
出栈
bool pop(PSTACK pS,int *pVal)//压栈,删除top
{
if(empty(pS))
{
return false;
}
else
{
PNODE p=pS->top;
*pVal=p->data;
pS->top=p->pNext;
free(p);
p=NULL;
return true;
}
}
遍历
void traverse(PSTACK pS)//遍历输出
{
PNODE p=pS->top;
while(p!=pS->bottom)
{
printf("%d ",p->data);
p=p->pNext;
}
printf("\n");
}
是否为空
bool empty(PSTACK pS)
{
if (pS->bottom==pS->top)
{
return true;
}
else
{
return false;
}
}
清空栈
void clear(PSTACK pS)//清空栈
{
if(empty(pS))
return;
else
{
PNODE p=pS->top;
PNODE q=NULL;
while (p!=pS->bottom)
{
q=p->pNext;
free(p);
p=q;
}
pS->top=pS->bottom;
}
}
求栈的长度
int length(PSTACK pS)//栈的长度;
{
PNODE p=pS->top;
int len=0;
while(p!=pS->bottom)
{
//printf("%d ",p->data);
len++;
p=p->pNext;
}
return len;
}
链式栈的应用
进制转换
void conversion()
{
STACK S;
init(&S);
int N;
int d;
printf("请输入转化成什么进制:");
scanf("%d",&d);
printf("请输入待转换数:");
scanf("%d",&N);
while(N)
{
push(&S,N%d);
N=N/d;
}
//push(&S,N%d);
traverse(&S);
}
括号匹配
void kuohaopipei()
{
STACK S;
init(&S);
PSTACK pS=&S;
for(int i=0;i<=n;i++)//n为输入括号的个数的两倍
{
int val,flag=1;
char k;
printf("请输入括号:\n");
scanf("%c",&k);
switch(k)
{
case '(':push(pS,1);break;
case '[':push(pS,2);break;
case '{':push(pS,3);break;
case ')':{
if (pS->top->data==1)
pop(pS,&val);
else
flag=0;
};break;
case ']':{
if (pS->top->data==2)
pop(pS,&val);
else
flag=0;
};break;
case '}':{
if (pS->top->data==3)
pop(pS,&val);
else
flag=0;
};break;
}
if (flag==0)
{
printf("不合法的括号输入!\n");
break;
}
}
}
若运行出现Debug Error,如图:
点击忽略即可。
若出现不合法的括号输入,程序直接终止。