栈是一种符合先进后出原则的数据结构
主要操作氛围进栈和弹栈。规则是栈顶元素先弹出而后进栈,进栈就是一个新的元素取代原本的栈顶元素。
栈可以用来进行最基本的括号匹配操作,栈的图示为:(转载)
具体代码如下
//定义栈
typedef struct zhan{int top;int data[max_size];
}*zhanptr; //of typedef //输出栈
void outputzhan(zhanptr paraptr)
{int i;for(i=0;i<paraptr->top;i++){printf("%c ",paraptr->data[i]);}printf("\r\n");
} //of output function//
接下来是压栈和弹栈的操作,压栈就是将一个元素放到栈顶,弹栈就是将栈顶元素弹出
void pushzhan(int paravalue,zhanptr paraptr)
{if(paraptr->top >=max_size-1){printf("can not do the action!\n");}paraptr->top++;paraptr->data[paraptr->top]=paravalue;
} //of push fuction///char popzhan(zhanptr paraptr)
{if(paraptr->top<0){printf("can not do this action!\n");}paraptr->top--;return paraptr->data[paraptr->top+1];
} //of pop fucton
括号匹配:
括号匹配就是寻找有效括号。即对每一个左括号,都有与之对应的右括号,这样的括号组合被称为有效括号。由于每一个左括号都要有右括号,那么可以利用栈的思想,将遍历到的左括号存入栈,遇到右括号则左括号出栈,最后若栈为空,则问题求解成功
前文定义了压栈和弹栈
这里就不再赘述
void pushPopTest() {printf("---- pushPopTest begins. ----\r\n");CharStackPtr tempStack = charStackInit();printf("After initialization, the stack is: ");outputStack(tempStack);for (char ch = 'a'; ch < 'm'; ch ++) {printf("Pushing %c.\r\n", ch);push(tempStack, ch);outputStack(tempStack);}char ch;for (int i = 0; i < 3; i ++) {ch = pop(tempStack);printf("Pop %c.\r\n", ch);outputStack(tempStack);}printf("---- pushPopTest ends. ----\r\n");printf("********************************************************************\r\n");
}
bool bracketMatching(char* paraString, int paraLength) {CharStackPtr tempStack = charStackInit();push(tempStack, '#');char tempChar, tempPopedChar;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;} break;case ']':tempPopedChar = pop(tempStack);if (tempPopedChar != '[') {return false;} break;case '}':tempPopedChar = pop(tempStack);if (tempPopedChar != '{') {return false;} break;default:break;}}tempPopedChar = pop(tempStack);if (tempPopedChar != '#') {return false;} return true;
}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);
}















