栈的简单应用1-平衡符号

因为在编程中,使用{}()[]等都是成对出现的,因此可以使用栈来进行一些匹配判断。

原理:

读取一段字符串,如果遇到{([这些开放字符,就将其压入栈中,如果读到})]这些封闭字符,就与当前栈顶的符号进行比较,如果栈顶的符号正好是其对应的开放符号,将栈顶元素弹出,继续读取。否则,出现警告。但是如果弹出栈顶后新的栈顶是与其匹配的开放符号,那么就是它出错了。如果全部字符串读取完毕但是栈不是空的的话,那么栈剩下的字符串都缺少匹配。

简单代码,因为使用的输入流问题对程序实现有较大误差,但思路没有问题,需要在C下修改使用,因为时间关系今天就结束这个问题。此代码没有实现对于全部字符读取完毕的检测,还有一些严重问题没有处理,所以此程序应该是失败的。请读者自己根据实际实现。

main.cpp

 1 #include "stack.h"
 2
 3 char matchSymbal(char s)
 4 {
 5     if (s == ‘)‘)
 6         return ‘(‘;
 7     if (s == ‘}‘)
 8         return ‘{‘;
 9     if (s == ‘]‘)
10         return ‘[‘;
11     return ‘ ‘;
12 }
13
14 int main(void)
15 {
16
17     stack *symbal = createStack(10);
18     char s;
19     char tmp;
20     while (std::cin>>s)
21     {
22         if (s == ‘{‘ || s == ‘(‘ || s == ‘[‘)
23         {
24             push(symbal, s);
25             continue;
26         }
27         if (s == ‘}‘ || s == ‘)‘ || s == ‘]‘)
28         {
29             if (isEmpty(symbal))
30             {
31                 log("空表错误");
32             }
33             else
34             {
35                 tmp = top(symbal);
36                 if (top(symbal) == matchSymbal(s))
37                 {
38                     pop(symbal);
39                     continue;
40                 }
41                 else
42                 {
43                     pop(symbal);
44                     if (top(symbal) == matchSymbal(s))
45                     {
46                         std::cout << "在 " << tmp << " 处发生错误" << std::endl;
47                         continue;
48                     }
49                     std::cout << "在 " << s << " 处发生错误" << std::endl;
50                 }
51             }
52         }
53     }
54     system("pause");
55     return 0;
56 }

stack.h

 1 /*数组栈*/
 2 #include "iostream"
 3 #include "stdlib.h"
 4
 5 #define  minSize 5
 6 #define  emptyStack -1
 7 #define  fullStack -2
 8 #define log(s); std::cout<<s<<std::endl;
 9
10 typedef struct _stack_
11 {
12     int capacity;
13     int topOfStack;
14     char *Array;
15 }stack;
16
17 stack *createStack(int maxSize)
18 {
19     stack *s;
20     if (maxSize < minSize)
21     {
22         //log("Stack size is too small");
23         return nullptr;
24     }
25     s = (stack *)malloc(sizeof(stack));
26     s->Array = (char *)malloc(sizeof(char) * maxSize);
27     s->capacity = maxSize;
28     s->topOfStack = emptyStack;/*初始化为空栈*/
29     return s;
30 }
31
32 int isFull(stack *s)/*检测是否为满栈*/
33 {
34     if (s == nullptr)
35     {
36         //log("the stack has not inital");
37         return fullStack;
38     }
39     return s->topOfStack == s->capacity;
40 }
41
42 int isEmpty(stack *s)/*是否为空栈*/
43 {
44     if (s == nullptr)
45     {
46         //log("the stack has not inital");
47         return emptyStack;
48     }
49     return s->topOfStack == emptyStack;
50 }
51
52 void push(stack *s, char data)/*压栈*/
53 {
54     if (isFull(s))
55     {
56         //log("Full of Stack");
57         return;
58     }
59     ++s->topOfStack;
60     s->Array[s->topOfStack] = data;
61 }
62
63 void pop(stack *s)/*弹出栈*/
64 {
65     if (isEmpty(s))
66     {
67         //log("Out of Stack");
68         return;
69     }
70     --s->topOfStack;
71 }
72
73 char top(stack *s)/*访问栈顶元素*/
74 {
75     if (isEmpty(s))
76     {
77         //std::cout << "Out of Stack,Code is ";
78         return emptyStack;
79     }
80     return s->Array[s->topOfStack];
81 }
82
83 void makeEmpty(stack *&s)/*置空栈*/
84 {
85     free(s->Array);
86     free(s);
87     s = nullptr;
88 }

抱歉。

以上。

时间: 2025-01-03 16:30:20

栈的简单应用1-平衡符号的相关文章

习题3.18 检测平衡符号(/* */ 不知怎么做)

/* 检测平衡符号 */ #include<stdio.h> #include<stdlib.h> struct stack; typedef struct stack * PtrToStack; struct stack{ char *Array; int TopOfStack; int Capacity; }; PtrToStack CreateStack( int MaxSize ) { PtrToStack p; p = malloc(sizeof(struct stack

栈及其简单应用

栈是什么 栈就是一个先进先出的线性表,若能够更加方便地去理解栈,我们可以跟剧具体的图来进行理解. 相信这个图十分的生动形象,可以看出栈就像是一个桶,若每一个元素进栈的时候,便会存储在最底下,后来的会在上面:而如果需要取出元素,那么必须从最上面开始取,先放的便只能后来取,后放的便只能先取,因此栈的特点便是:先进后出,后进先出. 如何模拟并存储栈的操作 为了方便,我们需要用数组去模拟栈的序列.即: 我们定义数组和变量来表示栈,即: Stack表示栈的序列,top代表栈的元素个数,那么自然: Stac

C#栈的简单介绍

概 栈(Stack)代表了一个只有一个出口的后进先出的对象集合.在列表中添加一项,称为推入元素,从列表中移除一项时,称为弹出元素. Stack<T> 类 public class Stack<T> : IEnumerable<T>, ICollection, IEnumerable 属性 Count 获取 Stack 中包含的元素个数 方法 Pop  移除并返回在 Stack 的顶部的对象 push 向 Stack 的顶部添加一个对象 peek 返回在 Stack 的顶

顺序栈的简单操作

今天简单的实现了一下顺序栈,栈的核心函数是push(),top(),pop().首先是我自己编写的栈,后面是STL标准库调用栈函数. sqstack.h //栈的简单实现lifo #ifndef SQSTACK_H_ #define SQSTACK_H_ const int DEFAULT_SIZE=10; #include <iostream> using std::cout; using std::endl; template <typename T> class Sqstac

C++中 栈的简单封装

/*******************  *      Stack    *  * *****************/ #include <iostream> using namespace std; /***************************定义***************************************/ class Stack {     public: Stack(int capacity = 5); virtual ~Stack(); bool p

链表栈的简单实现

今天实现了链表栈的简单实现,贴出来以后可以看一看.链表栈就是用链表来实现栈的一些操作. LinkStack.h #ifndef LINKSTACK_H_ #define LINKSTACK_H_ #include <iostream> using std::cout; using std::endl; using std::ostream; template <typename T> struct Node { T data; Node<T> *next; Node()

输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点 符号和普通字母一样处理

题目: 输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变.为简单起见,标点符号和普通字母一样处理 解答: 1 public class Solution { 2 public static void main(String[] args) { 3 String string = "I am a student."; 4 reverseSentence(string); 5 } 6 7 private static void reverseSentence(String s

数据结构之栈的简单应用(判断字符串中括号的合法性)

数据结构之栈(判断字符串中括号的合法性) 栈的定义 栈是一种线性数据结构,栈的特征是数据的插入和删除只能通过一端来实现,这一端称为"栈顶",相应的另一端称为"栈底":另外其还有先进后出,后进先出的特征. 栈是一种高效的数据结构,因为数据只能在栈的顶端添加或者删除,所以这样的操作很快而且容易实现. 说到线性结构,得先了解一下数据的逻辑结构,数据的逻辑结构分为线性结构.集合结构.树形结构和图形结构,如下图所示,栈是一种特殊的线性表,是线性结构的一种. JavaScrip

栈应用之平衡符号

栈的应用:检查每件事情是否能成对出现,算法叙述: 做一个空栈.读入字符直到文件结尾.如果字符是一个开放符号,则将其推入栈中.如果字符是一个封闭符号,则当栈为空时报错.否则,将栈元素弹出.如果弹出的符号不是对应的开放符号,则报错.在文件结尾,如果栈非空则报错. public class BalanceSigned { @SuppressWarnings("unchecked") public static void checkChar(char[] words,int size){ bo