您的位置:首页 > 理论基础 > 数据结构算法

数据结构栈的数组实现初始化,入栈,出栈,获取栈顶元素,栈的长度等操作

2014-08-05 15:39 381 查看
#ifndef _STACK_H
#define _STACK_H
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define STACK_INIT_SIZE 100  //栈初始化分配量
#define STACKINCREMENT 10    //存储空间的分配增量
typedef int SElemType  ;
typedef int Status ;

typedef struct {
SElemType *base ;
SElemType *top ;
int stacksize ;
}SqStack;

//------基本操作----------
Status InitStack(SqStack &s); //初始化栈
Status DestoryStack(SqStack &s);//销毁栈
Status ClearStack(SqStack &s);//清空栈
Status StackEmpty(SqStack s); //判断栈是否为空
int StackLength(SqStack s);//栈的长度
Status GetTop(SqStack s, SElemType &e);//获取栈顶元素
Status Push(SqStack &s, SElemType e); //入栈
Status Pop(SqStack &s , SElemType &e);//出栈
Status StackTraverse(SqStack s, Status(*visit)());//
void Display(SqStack s);
#endif

具体实现:

#include <stdio.h>
#include <stdlib.h>
#include "stack.h"

/**********************************************
初始化栈
**********************************************/

Status InitStack(SqStack &s){
s.base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType)) ;
if(!s.base) exit(OVERFLOW) ; //存储内存分配失败

s.top =	s.base   ;
s.stacksize = STACK_INIT_SIZE ;
return OK ;
}
/**********************************************
获取栈顶元素
**********************************************/
Status GetTop(SqStack s, SElemType &e){
//判断栈是否为空,若为空则返回error
if(s.base==s.top)
return ERROR ;
e = *(s.top-1);//取地址里的值
return OK ;
}
/**********************************************
入栈
**********************************************/
Status Push(SqStack &s, SElemType e){
//首先判断栈是否已满,若满则重新扩展空间
if((s.top-s.base) >= s.stacksize) {
s.base = (SElemType *)realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(SElemType));

if(!s.base) exit(OVERFLOW);

s.top = s.base+s.stacksize ;
s.stacksize += STACKINCREMENT ;
}
*s.top++ = e ;

return OK ;
}

/**********************************************
出栈
**********************************************/
Status Pop(SqStack &s , SElemType &e){
//出栈首先要判断栈是否为空,若为空则返回error
if(s.top==s.base) return ERROR ;
e = *(--s.top);    //先减后取
return OK ;
}

/**********************************************
//销毁栈
**********************************************/
Status DestoryStack(SqStack &s){
free(s.base);
s.base = NULL;
s.top = NULL;
s.stacksize = 0;

return OK ;
}

/**********************************************
//清空栈
**********************************************/
Status ClearStack(SqStack &s){
if(s.base==s.top) {
printf("栈已空");
return 1 ;
}else{
s.top = s.base ;
}
return OK ;
}

/**********************************************
//判断栈是否为空
**********************************************/
Status StackEmpty(SqStack s){
if(s.top==s.base)
return OK ;
return ERROR ;
}

/**********************************************
//栈的长度
**********************************************/
int StackLength(SqStack s){
int length =0;
if(s.top==s.base)
return 0 ;
while(s.top!=s.base){
length++ ;
s.top-- ; //栈顶指针移动
}
return length ;
}

/**********************************************
遍历栈元素
**********************************************/
void Display(SqStack s){
while(s.base!=s.top){
printf("%d\t", *(--s.top));
}
printf("\n");
}


主函数:

void main(){
SqStack s ;

/*初始化*/
if(InitStack(s))
printf("初始化成功\n");
printf("初始栈为空 = %d \n" , StackEmpty(s));
printf("初始化时栈的长度=  %d\n",StackLength(s));

/*入栈*/
printf("for init stack :\n ");
for(int i=0;i<5;i++){
Push(s,i);
}
printf("入栈后不为空 = %d \n" , StackEmpty(s));
printf("入栈的后长度=%d\n",StackLength(s));
Display(s);

/*出栈*/
int e ;
Pop(s,e);
printf("出栈的栈顶元素为= %d\n", e);
printf("after Pop......\n");
printf("出栈的后长度=  %d\n",StackLength(s));
Display(s);
/*获取栈顶元素*/
int f ;
GetTop(s,f);
printf("栈顶元素为= %d\n", f);
Display(s);

/*清空栈*/
ClearStack(s);
printf("栈已清空\n");
Display(s);

}


栈的应用

1.数制转换

//1.数制转换 10-->2,8,16进制
void Conversion(SqStack s){
int N ,e ;
printf("Input N:");
scanf("%d",&N);

while(N){
//进制转化,若十进制-->二进制,则N%/2,N=N/2 ,转八进制,则N%8,N=N/8
Push(s,N%16);
N = N/16 ;
}

while(!StackEmpty(s)){
Pop(s,e) ;
printf("%d" , e);
}
}

2.括号匹配(注意使用下面程序要结合上面的程序,并且把SElemType 改成为char类型)

Status Matcher(SqStack s, char *p){

SElemType e ;
while(*p){
switch (*p)
{
case '{':
case '[':
case '(': Push(s,*p++);
break;//只要是左括号就入栈
case '}':
case ']':
case ')':Pop(s,e);  //只要是右括号就出栈

if ((e=='{' && *p=='}') ||(e=='[' && *p==']') || (e=='(' && *p==')'))//比较出栈是否相等
p++;
else {
printf("括号不匹配!\n");
exit(ERROR);
}
break;
default :p++;//其他字符就后移
}
}
if (StackEmpty(s))
printf("括号匹配成功");
else
printf("缺少右括号!");
printf("\n");
return OK;
}
测试代码

void main(){
SqStack s;//初始化空栈
InitStack(s);
char ch[100];
printf("输一个含义有()[]{}的括号表达式:\n");
gets(ch);

Matcher(s, ch) ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐