本文最后更新于 94 天前,其中的信息可能已经过时,如有错误请发送邮件到 zhangweihao22@outlook.com
简介
此模块为学校数据结构必修课学习内容的记录与分享
全文大体分为一下几个部分
- 前言
- 背景
- 分析(伪代码部分)
- 代码
- 结果
- Points
前言
由于前段时间赶团队培训进度,后面需要对培训内容进行总结,因此以后相当一部分时间在 homework 上面的时间可能会减少,因此先贴出主要思路及要点,后面抽时间进行细节补充与整理
又挖坑了…QAQ
背景
在计算机语言编程当中,对称的中括号代表一个完整的变量作用域,其它的括号也有其特殊作用。因此,括号匹配是最基本也最重要的一个语法检查问题,在这一节将使用新学习到的栈数据结构,实现括号匹配机制。
分析:
括号分为左括号和右括号,右括号必须拥有与之对应的左括号,因此我们可以先存储左括号,当遇到右括号时进行弹栈,判断是否匹配,再进行进一步输出。
// 伪代码: // 判断输入符号 // 左括号 - 储存 // 右括号 - 弹栈 // 弹栈的左括号匹配 - 继续循环操作 // 弹栈的左括号不匹配 - 返回错误信息 // 返回正确匹配信息
代码
#include <stdbool.h> #include <stdio.h> #include <malloc.h> #define STACK_MAX_SIZE 10 /** * Linear stack of integers. The key is data. */ typedef struct CharStack { int top; char data[STACK_MAX_SIZE]; //The maximum length is fixed. } *CharStackPtr; /** * Output the stack. */ void outputStack(CharStackPtr paraStack) { for (int i = 0; i <= paraStack->top; i ++) { printf("%c ", paraStack->data[i]); }// Of for i printf("\r\n"); }// Of outputStack /** * Initialize an empty char stack. No error checking for this function. * @param paraStackPtr The pointer to the stack. It must be a pointer to change the stack. * @param paraValues An int array storing all elements. */ CharStackPtr charStackInit() { CharStackPtr resultPtr = (CharStackPtr)malloc(sizeof(struct CharStack)); resultPtr->top = -1; return resultPtr; }//Of charStackInit /** * Push an element to the stack. * @param paraValue The value to be pushed. */ void push(CharStackPtr paraStackPtr, int paraValue) { // Step 1. Space check. if (paraStackPtr->top >= STACK_MAX_SIZE - 1) { printf("Cannot push element: stack full.\r\n"); return; }//Of if // Step 2. Update the top. paraStackPtr->top ++; // Step 3. Push element. paraStackPtr->data[paraStackPtr->top] = paraValue; }// Of push /** * Pop an element from the stack. * @return The popped value. */ char pop(CharStackPtr paraStackPtr) { // Step 1. Space check. if (paraStackPtr->top < 0) { printf("Cannot pop element: stack empty.\r\n"); return '\0'; }//Of if // Step 2. Update the top. paraStackPtr->top --; // Step 3. Pop element. return paraStackPtr->data[paraStackPtr->top + 1]; }// Of pop /** * Test the push function. */ void pushPopTest() { printf("---- pushPopTest begins. ----\r\n"); char ch; // Initialize. CharStackPtr tempStack = charStackInit(); printf("After initialization, the stack is: "); outputStack(tempStack); // Pop. for (ch = 'a'; ch < 'm'; ch ++) { printf("Pushing %c.\r\n", ch); push(tempStack, ch); outputStack(tempStack); }//Of for i // Pop. for (int i = 0; i < 3; i ++) { ch = pop(tempStack); printf("Pop %c.\r\n", ch); outputStack(tempStack); }//Of for i printf("---- pushPopTest ends. ----\r\n"); }// Of pushPopTest /** * Is the bracket matching? * * @param paraString The given expression. * @return Match or not. */ bool bracketMatching(char* paraString, int paraLength) { // Step 1. Initialize the stack through pushing a '#' at the bottom. CharStackPtr tempStack = charStackInit(); push(tempStack, '#'); char tempChar, tempPopedChar; // Step 2. Process the string. for (int i = 0; i < paraLength; i++) { tempChar = paraString[i]; switch (tempChar) { case '(': case '[': case '{': push(tempStack, tempChar); break; case ')': tempPopedChar = pop(tempStack); if (tempPopedChar != '(') { return false; } // Of if break; case ']': tempPopedChar = pop(tempStack); if (tempPopedChar != '[') { return false; } // Of if break; case '}': tempPopedChar = pop(tempStack); if (tempPopedChar != '{') { return false; } // Of if break; default: // Do nothing. break; }// Of switch } // Of for i tempPopedChar = pop(tempStack); if (tempPopedChar != '#') { return false; } // Of if return true; }// Of bracketMatching /** * Unit test. */ void bracketMatchingTest() { char* tempExpression = "[2 + (1 - 3)] * 4"; bool tempMatch = bracketMatching(tempExpression, 17); printf("Is the expression '%s' bracket matching? %d \r\n", tempExpression, tempMatch); tempExpression = "( ) )"; tempMatch = bracketMatching(tempExpression, 6); printf("Is the expression '%s' bracket matching? %d \r\n", tempExpression, tempMatch); tempExpression = "()()(())"; tempMatch = bracketMatching(tempExpression, 8); printf("Is the expression '%s' bracket matching? %d \r\n", tempExpression, tempMatch); tempExpression = "({}[])"; tempMatch = bracketMatching(tempExpression, 6); printf("Is the expression '%s' bracket matching? %d \r\n", tempExpression, tempMatch); tempExpression = ")("; tempMatch = bracketMatching(tempExpression, 2); printf("Is the expression '%s' bracket matching? %d \r\n", tempExpression, tempMatch); }// Of bracketMatchingTest /** The entrance. */ void main() { // pushPopTest(); bracketMatchingTest(); }// Of main
结果
Is the expression '[2 + (1 - 3)] * 4' bracket matching? 1 Is the expression '( ) )' bracket matching? 0 Is the expression '()()(())' bracket matching? 1 Is the expression '({}[])' bracket matching? 1 Is the expression ')(' bracket matching? 0 Press any key to continue
Post Views: 136