数据结构栈的数组实现初始化,入栈,出栈,获取栈顶元素,栈的长度等操作
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) ; }
相关文章推荐
- C语言实现顺序栈的基本操作(初始化、判断空、入栈、出栈、获取栈顶元素)
- C++栈的初始化,入栈,出栈,获取栈顶元素等操作
- 栈的链式存储的定义、初始化、判断空、入栈、出栈、读取栈顶元素、求栈长度、清空栈操作
- Java 用数组实现栈 (Stack),包括栈的初始化,入栈、出栈等操作
- 链栈:初始化、判断栈空、入栈、出栈、获取栈顶元素等
- 顺序栈和链式栈的结构及其基本操作(置空,获取栈顶元素,入栈,出栈)
- 栈的顺序存储的初始化、判断栈空、入栈、出栈、读取栈顶元素、栈置空、求栈长操作
- 顺序栈的基本操作:初始化、进栈、出栈、读栈顶元素
- 采用顺序存储实现栈的初始化、入栈、出栈操作。
- js获取对象、数组的实际长度,元素实际个数的实现代码
- C++实现普通队列,循环队列的基本操作(初始化,入队,出队,获取队列首元素等)
- 顺序栈的定义、初始化、出栈、入栈等操作 C++代码实现
- 实现一个栈(元素遵守先入后出顺序),能够通过 min 方法在 O(1)时间内获取栈中的最小元素。同时,栈的基本操作:入栈(Push)、出栈(Pop),也是在O(1)时间内完成的
- 【源代码】C++算法(三)堆栈的基本操作(出栈,入栈,销毁,数组初始化和空栈初始化)
- 链式堆栈的初始化、出栈、入栈、取栈顶元素、判空
- 顺序栈的定义、初始化、出栈、入栈等操作 C++代码实现 ——感想
- c++ 实现顺序栈类(初始化,入栈,退栈。读栈顶元素以及顺序输出栈顶指针与栈中的元素<<计算机软件技术基础 徐士良>>
- 顺序栈的基本操作:初始化、进栈、出栈、读栈顶元素
- 创建长度为16的整型数组,初始化前15个元素,将一个数插入到a[0]
- C语言数组实现栈的基本操作,并利用O(1)求出栈中最小元素