`

栈的操作

阅读更多

从今天开始,重写《数据结构C语言版:严蔚敏》一书里的程序。毕竟数据结构是一个程序员的内功。以后定期每隔一天更新一次。若对数据结构不熟悉的同学可以一看,现在先写了顺序栈的代码

P.S. 所有代码在C-free 5.0上通过编译运行,程序里用到一个common.h的头文件,里面保存一些常用的宏定义

 

栈的特性:后进先出。。。

以下是顺序栈的结构:SeqStack.h

 

#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10

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

 

栈的ADT(abstract data type,抽象数据类型) 有initStack,destroyStack,clearStack,StackEmpty,StackLength,getTop,push,pop

 

seqStack.c为具体实现:

#include <common.h>
#include <stdio.h>
#include "SeqStack.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 destroyStack(SqStack *s){
	free(s->base);
	s->base = NULL;
	s->top = NULL;
	s->stackSize = 0;
	return OK;
}

Status clearStack(SqStack *s){
	s->top = s->base;
	return OK;
}

Status stackEmpty(SqStack *s){
	if(s->base == s->top) return TRUE;
	return FALSE;
}

int stackLength(SqStack *s){
	return (s->top - s->base);
}

Status getTop(SqStack *s, SElemType *e){
	if(s->top == s->base)
		return ERROR;
	*e = *(s->top - 1);
	return OK;
}

Status push(SqStack *s, SElemType e){
	if(s->top - s->base >= s->stackSize){
		printf("realloc\n");
		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){
	if(s->top == s->base) return ERROR;
	*e = *--s->top;
	return OK;
}

void printSqStack(SqStack *s){
	if(s->base == s->top){
		printf("stack is null");
		return;
	}
	SElemType *tmp = s->top;
	while(--tmp != s->base){
		printf("%d ",*tmp);
	}
	printf("%d\n",*s->base);
}
 

定义了ADT后,就可以用栈进行相关的操作,利用栈先进后出的特性,可以进行数制转换,括号匹配的检验和行编辑程序

 

conversion.c 利用栈进行数制转换的代码

 
typedef int SElemType;
#include"SeqStack.c"

//输入非负十进制数,打印其十六进制 
void dec2hex(){
	SqStack s;
	int a,e;
	initStack(&s);
	scanf("%d",&a);
	while(a){
		push(&s,a % 16);
		a /= 16;
	}
	while(!stackEmpty(&s)){
		pop(&s,&e);
		printf("%d",e);
	}
	printf("\n");
}

main(){
	dec2hex();
}
 

bracketMatch.c 利用栈进行括号匹配的代码

/* 括号匹配算法,只对()[]有效 */ 
typedef char SElemType;
#include"SeqStack.c"

void bracketMatch(){
	SqStack s;
	SElemType ch[100],*p,e;
	initStack(&s);
	printf("please input str:");
	gets(ch);
	p = ch;
	while(*p){
		switch(*p){
			case '(':
			case '[':
				push(&s,*p++);
				break;
			case ')':
			case ']':
				if(!stackEmpty(&s)){
					pop(&s,&e);
					if(e == '(' && *p == ')' || e == '[' && *p == ']'){
						//match
						p++;
						break;
					}else{ //not match
						printf("括号不匹配\n");
						exit(ERROR);
					}
				}else{ //statck empty
					printf("缺少左括号\n");
					exit(ERROR);
				}
			default:
				p++;
		}
	}
	//printSqStack(&s);
	if(stackEmpty(&s)){
		printf("匹配完成\n");
	}else{
		printf("缺少右括号\n");
	}
	
}

main(){
	bracketMatch();
}
 

以上代码应注意的是:在具体算法实现时才定义SElemType,typedef int/char SElemType;的语句必须在

#include"SeqStack.c"

前才可以。

 

testSqStack.c是对栈的adt的测试代码

 

分享到:
评论

相关推荐

    C语言实现栈操作

    假设给定的整数栈 初始状态为空,栈的最大容量为100.从标准输入中输入一组栈操作,按操作顺序输出出栈元素序列。...从标准输入读取一组栈操作,入栈的整数和表示栈操作的整数之间都以一个空格分隔,输出出栈元素序列。

    c语言栈操作源代码直接运行

    ### C语言栈操作源代码解析 #### 一、引言 在计算机科学中,栈(Stack)是一种重要的数据结构,采用后进先出(LIFO, Last In First Out)的原则进行数据存储与检索。栈广泛应用于函数调用、表达式求值、递归算法等...

    数据结构 整数计算 C语言 栈操作

    根据给定的信息,本文将对“数据结构 整数计算 C语言 栈操作”这一主题进行深入探讨。主要内容包括:栈的基本概念、整数计算在C语言中的实现、利用栈来解析并计算数学表达式的原理及步骤。 ### 栈的基本概念 栈是...

    C++模拟栈操作源程序

    本篇将详细介绍C++模拟栈操作的相关知识点。 首先,我们需要理解栈的基本操作。栈通常包括以下基本操作: 1. **压栈(push)**:将元素添加到栈顶。 2. **弹栈(pop)**:移除并返回栈顶元素。 3. **查看栈顶元素...

    Dlephi链表实现栈操作_delphi_

    2. **弹栈(Pop)**:弹栈操作则是移除并返回栈顶元素。由于我们使用的是双向链表,我们可以直接访问并删除头节点,然后将头节点设置为原头节点的后继节点。这样,栈顶元素就被移除了,而下一层元素成为新的栈顶。 3....

    建立栈和栈的逆置 栈操作

    至于提供的`text2.cpp`和`实验1_2_1.exe`文件,它们可能是实现上述栈操作的源代码和编译后的可执行文件。通过阅读`text2.cpp`源代码,你可以更深入地了解栈操作的实现细节。运行`实验1_2_1.exe`,则可以直接观察到栈...

    栈操作程序

    在提供的文件中,“3.2.cpp”可能是一个C++源代码文件,用于实现栈操作的程序。C++中的栈操作主要通过标准模板库(STL)中的`stack`容器来完成。下面我们将详细讨论栈的操作和其在C++中的应用。 1. **栈的基本操作**...

    C通用栈操作模块.zip

    在C语言中,虽然没有内置的栈数据结构,但我们可以利用数组或动态内存分配来实现自己的栈操作模块。这个"C通用栈操作模块.zip"提供了一种通用的解决方案,适用于处理各种类型的数据,并且兼容Linux和Windows操作系统...

    栈的基本操作

    如果栈非空,栈顶指针`top`向低地址移动一位,覆盖掉栈顶元素,然后读取并输出被覆盖的元素值,完成一次弹栈操作。 #### 总结 栈的基本操作包括初始化、压栈、取栈顶元素和弹栈。正确理解和掌握这些操作对于编程和...

    C++ 实现栈操作的算法

    本主题将深入探讨如何使用C++编写栈操作的算法,包括栈的初始化、判断栈是否为空、入栈、出栈以及获取栈顶元素。 1. **栈初始化** 在C++中,我们可以使用数组或者`std::vector`来实现栈的初始化。对于数组,我们...

    栈操作源代码

    在这个“栈操作源代码”中,我们主要会探讨如何使用C++来实现栈的基本操作,包括入栈、出栈、清空栈、销毁栈以及读取栈顶元素。 首先,我们要了解栈的基本概念。栈是一种线性数据结构,它的特点是只能在一端进行...

    C语言实现的栈操作(基于数据结构(C语言版))

    在本主题中,“C语言实现的栈操作(基于数据结构(C语言版))”将探讨如何使用C语言来创建和操作栈。我们将深入理解栈的基本操作,包括初始化、销毁、设置为空栈、出栈和入栈。 首先,初始化一个栈通常涉及分配内存来...

    数据结构 模拟停车场的栈操作

    ### 数据结构:模拟停车场的栈操作 在计算机科学领域中,数据结构是研究如何组织、管理数据的关键技术之一。本篇文章将重点介绍一种利用栈这一数据结构来模拟停车场的实现方式,通过具体的代码实例帮助读者深入理解...

    栈操作代码(中文注释)

    大学数据结构课程栈操作代码C++(中文注释)..............................................................................................................................

    顺序栈,压栈、弹栈、获得栈顶元素、统计栈中元素个数、打印栈中元素

    3. **弹栈(Pop)**:弹栈操作用于移除栈顶元素。在执行此操作前,会检查栈是否为空(即top是否等于-1)。如果栈非空,就将top减1,并返回栈顶元素;否则,表示栈为空,无法进行弹栈操作。 4. **获取栈顶元素(Peek...

    数据结构 栈操作 C语言实现

    本项目“数据结构 栈操作 C语言实现”提供了C语言编写的栈操作代码,体现了对栈的基本理解和应用。 栈的操作通常包括以下几个基本元素: 1. **初始化栈**:创建一个新的空栈,通常涉及分配内存空间以存储栈中的...

    数据结构-栈操作(c语言)

    根据给定的文件信息,我们可以深入探讨数据结构中的栈操作,特别是使用C语言实现的双端栈。在本文中,我们将详细解析栈的基本概念、双端栈的特点以及代码中的关键函数,包括初始化栈、判断栈是否为空或满、入栈、...

    栈操作----

    // 弹栈操作 myStack.pop(); std::cout 弹栈后栈顶元素是: " () ; // 输出:2 // 检查栈是否为空 if (myStack.empty()) { std::cout 栈为空" ; } else { std::cout 栈非空" ; } return 0; } ``` 上述...

    Java算法实例-链栈和顺序栈操作

    2. **单元测试**:编写测试用例,涵盖正常情况和边界情况,如空栈操作、满栈操作、连续入栈和出栈等。 3. **性能比较**:对比链栈和顺序栈在不同场景下的性能差异,例如在大量元素的压入和弹出操作下,观察哪种栈的...

Global site tag (gtag.js) - Google Analytics