一、栈的基本操作
栈的基本操作主要有:栈的初始化、判空、判满、取栈顶元素、在栈顶进行插入和删除。在栈顶插入元素称为入栈,在栈顶删除元素称为出栈。
二、老师的代码----栈
#include#include #define STACK_MAX_SIZE 10 typedef struct CharStack{ int top; int data[STACK_MAX_SIZE];//The maximum length is fixed. }*CharStackPtr; void outputStack(CharStackPtr paraStack){ for(int i=0;i<=paraStack->top;i++){ printf("%c",paraStack->data[i]); }//of for i printf("rn"); }//of outputStack CharStackPtr charStackInit(){ CharStackPtr resultPtr=(CharStackPtr)malloc(sizeof(CharStack)); resultPtr->top=-1; return resultPtr; }//of charStackInit void push(CharStackPtr paraStackPtr, int paraValue){ //Step 1.Space check. if(paraStackPtr->top>=STACK_MAX_SIZE-1){ printf("Cannot push element:stack full.rn"); return; }//of if //Step 2.Update the top. paraStackPtr->top++; //Step 3. Push element. paraStackPtr->data[paraStackPtr->top]=paraValue; }//of push char pop(CharStackPtr paraStackPtr){ //Step 1. Space check. if(paraStackPtr->top<0){ printf("Cannot pop element:stack empty.rn"); return ' '; }//of if //Step 2.Update the top. paraStackPtr->top--; //step 3. Push element. return paraStackPtr->data[paraStackPtr->top+1]; }//of pop void pushPopTest(){ printf("----pushPopTest begins.----rn"); //Initialize. CharStackPtr tempStack=charStackInit(); printf("After initialization,the stack is:"); outputStack(tempStack); //pop for(char ch='a';ch<'m';ch++){ printf("Pushing %c.rn",ch); push(tempStack,ch); outputStack(tempStack); }//of for i //Pop for(int i=0;i<3;i++){ char ch; ch = pop(tempStack); printf("Pop %c.rn",ch); outputStack(tempStack); }//of for i printf("----pushPopTest ends.----rn"); }//of pushPopTest int main(){ pushPopTest(); }//of main
括号匹配
#include#include #define STACK_MAX_SIZE 10 typedef struct CharStack { int top; int data[STACK_MAX_SIZE]; //The maximum length is fixed. } *CharStackPtr; void outputStack(CharStackPtr paraStack) { for (int i = 0; i <= paraStack->top; i ++) { printf("%c ", paraStack->data[i]); }// Of for i printf("rn"); }// Of outputStack CharStackPtr charStackInit() { CharStackPtr resultPtr = (CharStackPtr)malloc(sizeof(struct CharStack)); resultPtr->top = -1; return resultPtr; }//Of charStackInit void push(CharStackPtr paraStackPtr, int paraValue) { // Step 1. Space check. if (paraStackPtr->top >= STACK_MAX_SIZE - 1) { printf("Cannot push element: stack full.rn"); return; }//Of if // Step 2. Update the top. paraStackPtr->top ++; // Step 3. Push element. paraStackPtr->data[paraStackPtr->top] = paraValue; }// Of push char pop(CharStackPtr paraStackPtr) { // Step 1. Space check. if (paraStackPtr->top < 0) { printf("Cannot pop element: stack empty.rn"); return ' '; }//Of if // Step 2. Update the top. paraStackPtr->top --; // Step 3. Push element. return paraStackPtr->data[paraStackPtr->top + 1]; }// Of pop void pushPopTest() { printf("---- pushPopTest begins. ----rn"); // Initialize. CharStackPtr tempStack = charStackInit(); printf("After initialization, the stack is: "); outputStack(tempStack); // Pop. for (char ch = 'a'; ch < 'm'; ch ++) { printf("Pushing %c.rn", ch); push(tempStack, ch); outputStack(tempStack); }//Of for i // Pop. for (int i = 0; i < 3; i ++) { char ch; ch = pop(tempStack); printf("Pop %c.rn", ch); outputStack(tempStack); }//Of for i printf("---- pushPopTest ends. ----rn"); }// Of pushPopTest 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 true; } // Of if return true; }// Of bracketMatching void bracketMatchingTest() { char* tempExpression = "[2 + (1 - 3)] * 4"; bool tempMatch = bracketMatching(tempExpression, 17); printf("Is the expression '%s' bracket matching? %d rn", tempExpression, tempMatch); tempExpression = "( ) )"; tempMatch = bracketMatching(tempExpression, 6); printf("Is the expression '%s' bracket matching? %d rn", tempExpression, tempMatch); tempExpression = "()()(())"; tempMatch = bracketMatching(tempExpression, 8); printf("Is the expression '%s' bracket matching? %d rn", tempExpression, tempMatch); tempExpression = "({}[])"; tempMatch = bracketMatching(tempExpression, 6); printf("Is the expression '%s' bracket matching? %d rn", tempExpression, tempMatch); tempExpression = ")("; tempMatch = bracketMatching(tempExpression, 2); printf("Is the expression '%s' bracket matching? %d rn", tempExpression, tempMatch); }// Of bracketMatchingTest int main() { // pushPopTest(); bracketMatchingTest(); }// Of main
运行结果



