之前学习了栈的基本操作,并且学习了栈的两种实现方式:链式存储和顺序存储(数组)。现在看看栈都有哪些应用。栈的一个主要应用是平衡符号。
初学者在编写代码并且编译时,难免会因为少写了一个')'和被编译器报错。也就是说,编译器会去匹配括号是否匹配。当你输入了一个'(',很自然编译器回去检查你是否有另一个')'符号与之匹配。如果所有的括号都能够成对出现,那么编译器是能够通过的。否则编译器会报错。例如字符序列“(a+b)”是匹配的,而字符序列"(a+b]"则不是。
在检测括号匹配的算法中使用到了栈,算法描述如下:创建一个空栈,读取字符序列直到结尾。如果字符是开放符号'(''[''{',将其入栈;如果是一个封闭符号')'']''}',则当栈为空时报错。否则,将栈顶元素弹出。如果弹出的符号不是对应的开放符号,则报错。当字符序列结束,判断栈是否为空,为空则报错。
下面是我的实现代码:
#include <stdio.h>
#include <stdlib.h>
#define ElementType char
typedef struct Node *PtrToNode;
typedef PtrToNode Stack;
typedef struct Node
{
ElementType Element;
PtrToNode Next;
};
int IsEmpty(Stack S);
Stack CreateStack();
void DisposeStack(Stack S);
void MakeEmpty(Stack S);
void Push(ElementType X,Stack S);
ElementType Top(Stack S);
void Pop(Stack S);
//判断栈是否为空
int IsEmpty(Stack S)
{
return S->Next == NULL;
}
//创建链栈
Stack CreateStack()
{
Stack S = malloc(sizeof(struct Node));
if(S == NULL)
{
printf("No enough memory!");
return NULL;
}
S->Next = NULL;
MakeEmpty(S);
return S;
}
void MakeEmpty(Stack S)
{
if(S == NULL)
{
printf("Use CreateStack First!");
}
else
{
while(!IsEmpty(S))
{
Pop(S);
}
}
}
void Push(ElementType X,Stack S)
{
PtrToNode Tmp;
Tmp = malloc(sizeof(struct Node));
if(Tmp != NULL)
{
Tmp->Element = X;
Tmp->Next = S->Next;
S->Next = Tmp;
}
else
{
printf("Out of space!");
}
}
void Pop(Stack S)
{
if(IsEmpty(S))
{
printf("The Stack is Empty!");
}
else
{
PtrToNode Tmp = S->Next;
S->Next = Tmp->Next;
free(Tmp);
}
}
ElementType Top(Stack S)
{
if(IsEmpty(S))
{
printf("The stack is empty!");
return 0;
}
else
{
return S->Next->Element;
}
}
//平衡符号判断
void balance(char *ch,Stack S)
{
ElementType c;
MakeEmpty(S);
while((c=*ch) != '\0')
{
printf("%c\n",c);
switch(c)
{
case '(':
case '[':
case '{':
Push(c,S);
break;
case ')':
if(IsEmpty(S))
{
fprintf(stderr,"The symbols not balance!\n");
return;
}
else
{
if(Top(S)=='(')
{
Pop(S);
}
else
{
fprintf(stderr,"The symbols not balance!\n");
return;
}
}
break;
case ']':
if(IsEmpty(S))
{
fprintf(stderr,"The symbols not balance!\n");
return;
}
else
{
if(Top(S)=='[')
{
Pop(S);
}
else
{
fprintf(stderr,"The symbols not balance!\n");
return;
}
}
break;
case '}':
if(IsEmpty(S))
{
fprintf(stderr,"The symbols not balance!\n");
return;
}
else
{
if(Top(S)=='{')
{
Pop(S);
}
else
{
fprintf(stderr,"The symbols not balance!\n");
return;
}
}
break;
default:
break;
}
ch++;
}
if(IsEmpty(S))
{
fprintf(stdout,"The Symbols Balance!\n");
}
else
{
fprintf(stderr,"The Symbols Not Balance!\n");
}
}
int main(void)
{
char ch[] = "(a+b){[d]c*d}{";
Stack S = CreateStack();
balance(ch,S);
return 0;
}
分享到:
相关推荐
《算法与数据结构——C语言描述(第2版)》是张乃孝先生撰写的一本经典教材,专注于讲解计算机科学中的核心概念:算法和数据结构。这本书以C语言为工具,深入浅出地阐述了各种数据结构的实现原理及其在实际问题中的...
在本实验报告“《算法与数据结构》实验报告实验3--栈与队列的应用”中,主要探讨了两种基本数据结构——栈与队列在实际问题中的应用。实验内容包括链式栈的操作、循环队列的创建与操作,以及符号平衡问题的解决。 1...
通过完成这项作业,学生将能够深入理解数据结构(如栈和哈希表)的应用,掌握解析和求解表达式的技术,并熟悉编程语言中的数值处理。同时,这也是一个很好的实践,可以锻炼问题解决、逻辑思考和调试技能。
《数据结构与算法分析——C语言描述》是计算机科学领域一本经典的教材,主要涵盖了数据结构和算法的基础理论以及实现方法,特别强调了C语言作为实现工具。这本书的随书练习通常包括一系列的问题和编程任务,旨在帮助...
实验3主要探讨了两种基本数据结构——栈与队列的应用,并通过C语言实现了相关的操作。在互联网行业中,栈和队列作为基础数据结构,广泛应用于各种算法和系统设计中。 首先,链式栈的创建与操作是实验的核心部分。...
总的来说,这个实验报告涵盖了基础的数据结构——栈和队列的实现以及应用,是学习算法与数据结构的重要实践。通过这些练习,学生可以更好地理解这两种数据结构的工作原理,并能将它们应用于实际问题的解决。
分析数据结构性能通常使用大O符号,如O(1)常数时间、O(n)线性时间、O(n^2)平方时间等。 9. **算法设计**:好的数据结构往往伴随着高效的算法,如分治法、动态规划、贪心法和回溯法等,这些算法设计技巧是解决复杂...
- **B-树**:一种自平衡的树数据结构,用于数据库和文件系统中。 - **散列(Hash)表及其查找**:通过哈希函数将键映射到表的一个位置来访问记录,以加快查找的速度。 #### 七、内部排序 - **插入排序**:通过构建...
2. **栈**:栈是一种后进先出(LIFO)的数据结构,常用于递归、表达式求值和内存管理。Java中的Stack类提供了栈操作的支持。 3. **队列**:队列是一种先进先出(FIFO)的数据结构,适用于任务调度和消息传递。Java...
本主题聚焦于“哈工大数据结构与算法实验四——平衡树”,这是一项旨在深入理解并实践平衡树数据结构的教学任务。哈尔滨工业大学,作为中国顶尖的工科大学之一,其计算机学院的课程设置严谨且具有挑战性,而这个实验...
- **第三章:列表、栈和队列** —— 探讨了这些基础数据结构的实现方式和应用场景,例如数组和链表实现列表。 - **第四章:树** —— 深入讨论了树的各种类型(如二叉树、平衡树等)及其操作,如遍历、插入和删除。 ...
《算法与数据结构C与C++描述》是针对计算机科学中的核心概念——算法和数据结构进行深入探讨的教材。在编程领域,理解并熟练运用这些概念对于提升代码效率和优化程序设计至关重要。本文将详细阐述其中的关键知识点。...
除了以上所述的基础知识,数据结构考研还会涉及更多内容,如栈、队列、排序算法(如冒泡排序、快速排序、归并排序)、查找算法(如二分查找、哈希查找)、树(如二叉树、平衡树、B树、B+树)和图(如最短路径算法、...
他是我国计算机普及和高校计算机基础教育开拓者之一,现任全国高等院校计算机基础教育研究会会长、教育部全国计算机应用技术证书考试委员会主任委员。 谭浩强教授创造了3个世界纪录:(1)20年来他(及和他人合作)...
- **跳表(Skip List)**:介绍一种高级的数据结构——跳表,探讨其优点及应用场景。 #### 五、栈与队列 - **栈(Stack)**:讲解栈的基本概念、性质和实现方法。 - **栈的应用**:介绍栈在编程中的实际应用,如表达式...
本书可作为高等院校计算机相关专业算法与数据结构课程的教材和补充读物,也可供自学之用。 目录 出版者的话 译者序 前言 第一部分 基础知识 第1章 引言 1.1 算法 1.2 典型问题——连通性 1.3 合并一...
- **列表、栈与队列 (Chapter 3)**:介绍这些基本数据结构的定义、特点及应用场景,如线性表、链表、数组实现的栈与队列等。 - **树结构 (Chapter 4)**:深入讲解树形结构,包括二叉树、平衡树、红黑树等,及其在...
树形结构是一种非常重要的非线性数据结构,在实际应用中有着广泛的应用,如文件系统、编译器符号表等。本书中将会详细介绍以下几种树形结构: - **二叉树**(Binary Trees):每个节点最多有两个子节点的树形结构,...