数据结构栈的数组实现初始化,入栈,出栈,获取栈顶元素,栈的长度等操作
来源:互联网 发布:c string数组添加元素 编辑:程序博客网 时间:2024/05/03 06:54
#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){//判断栈是否为空,若为空则返回errorif(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){//出栈首先要判断栈是否为空,若为空则返回errorif(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/8Push(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) ;}
0 0
- 数据结构栈的数组实现初始化,入栈,出栈,获取栈顶元素,栈的长度等操作
- C++栈的初始化,入栈,出栈,获取栈顶元素等操作
- C语言实现顺序栈的基本操作(初始化、判断空、入栈、出栈、获取栈顶元素)
- 链栈:初始化、判断栈空、入栈、出栈、获取栈顶元素等
- Java 用数组实现栈 (Stack),包括栈的初始化,入栈、出栈等操作
- 栈的基本操作模板类,包括栈的压入,出栈,删除栈顶元素,清空栈等操作
- 顺序栈的定义、初始化、出栈、入栈等操作 C++代码实现
- [数据结构]c语言实现链栈的入栈,出栈,清空,销毁等操作
- [数据结构]c语言实现顺序栈的入栈,出栈,清空,销毁等操作
- 链栈的初始化 入栈 出栈 打印栈中的元素等基础内容
- 数据结构:stack栈的初始化、入栈、出栈及显示栈元素
- 顺序栈的定义、初始化、出栈、入栈等操作 C++代码实现 ——感想
- 栈模板的链表实现(包含头结点),实现了栈的压入,栈的弹出,返回栈顶元素,排序等操作
- 链栈的定义、初始化、出栈、入栈等操作
- stack容器的用法:入栈、出栈、访问栈顶元素,判断是否为空
- 数据结构之栈的初始化、创建、入栈、出栈、销毁-c++代码实现
- 链栈的常用操作(初始化,入栈,出…
- 采用顺序存储实现栈的初始化、入栈、出栈操作。
- 导热系数/热阻测试--美信检测
- (高德地图)MapView出不来界面
- java Socket(二)
- MFC控件编程:Tab Control
- 关联容器
- 数据结构栈的数组实现初始化,入栈,出栈,获取栈顶元素,栈的长度等操作
- 用C#写的相似图像搜索---感知哈希算法
- hdoj1106 排序
- CDC算法测试问题
- C语言是学习编程的第一门语言
- mac下zend studio快捷键总结
- linux mysql 导入导出数据
- 我国常用的地图坐标系
- java.lang.OutOfMemoryError: PermGen space及其解决方法