由指针实现的栈,然后做一些小应用程序 /* author:star Data:2011.04.23 由指针实现的栈,然后做一些小应用程序 */ #include<iostream> #include<stdio.h> #include<malloc.h> #include<string.h> using namespace std; typedef int ElemType; typedef int Status; #define ERROR 0; #define OVERFLOW 0; #define OK 1; typedef struct StackNode { int data; struct StackNode *next; }SNode; typedef struct Stack { struct StackNode *top;//栈顶指针 int length; }Stack; Status InitStack( Stack &S ) {//初始化栈 S.top = ( SNode * ) malloc( sizeof( SNode ) ); if ( !S.top ) return ERROR; S.top ->next = NULL; S.length = 0; return OK; } int StackLength( Stack S ) {//返回栈的长度 return S.length; } Status Pop( Stack &S,ElemType &e ) {//出栈操作,并将栈顶元素赋给e if( !StackLength( S ) ) { cout <<"Stack is empty!"<<endl; return ERROR; } e = S.top ->next ->data; SNode *p = S.top ; S.top = S.top ->next; free( p );//把出栈的元素内存区域收回 p = NULL; S.length --;//栈的长度减1 return OK; } Status Push( Stack &S, ElemType e ) {//入栈操作,将元素e压入栈中 SNode *p; p = ( SNode * ) malloc ( sizeof( SNode ) ); if ( !p ) { cout << "内存分配失败"<<endl; return ERROR; } p ->data = e; p ->next = S.top ->next ; S.top ->next = p; S.length ++; cout <<"将元素"<<e<<"压入栈中"<<endl; return OK; } Status Push( Stack &S, char e ) {//重载函数Push,用于括号匹配算法中 SNode *p; p = ( SNode * ) malloc ( sizeof( SNode ) ); if ( !p ) { cout << "内存分配失败"<<endl; return ERROR; } p ->data = e; p ->next = S.top ->next ; S.top ->next = p; S.length ++; cout <<"将元素"<<e<<"压入栈中"<<endl; return OK; } Status Pop( Stack &S, char &e ) {//重载函数Pop,此函数用于括号匹配算中 if( !StackLength( S ) ) { cout <<"Stack is empty!"<<endl; return ERROR; } e = S.top ->next ->data; SNode *p = S.top ; S.top = S.top ->next; free( p );//把出栈的元素内存区域收回 p = NULL; S.length --;//栈的长度减1 cout << "元素"<< e <<"出栈"<<endl; return OK; } Status OutStack( Stack S ) {//输出链表中元素 if ( !S.length ) return ERROR; SNode *p = S.top ->next ; cout << "输出链表:"<<endl; for( int i = 1; i < S.length ; i++ ) { cout << p ->data <<"、"; p = p ->next ; } cout << endl; return OK; } Status conversion() {//对于输入的任意一个非负十进制整数 //打印输出与其等值的八进制数 Stack S; if( !InitStack( S ) ) return ERROR;//初始化失败 int N; cout << "输入一个十进制整数,该操作将会将其转换成八进制整数"<<endl; scanf( "%d", &N ); if ( N < 0 ) return ERROR; while( N ) { Push( S, N % 8 ); N = N / 8; } int e = 0; cout <<"转换成的八进制数为:"; while( S.length ) { Pop( S, e ); printf( "%d", e ); } return OK; } Status Parentheses() {//括号匹配算法的实现,可以检测()[ ]括号是否配对 Stack S; if( !InitStack( S ) ) return ERROR; char expr[ 4 ]={'(','(','(',')'}; char e; char *p; p =expr; for( int i = 0; i < 4; i++ ) { switch( *p ) { case '(': case '[': Push( S, *p ); p++; break; case ')': case ']': if ( S.length ) { Pop( S, e ); cout << "e为:"<<e <<endl; if( *p == ')' && e != '(' || *p == '[' && e != ']' )//注意, &&的优先级高于 || ,所以先运算什么要先看清,&&运算符是左结合性的 {//栈顶的括号与目前×P指向的括号不匹配 cout <<"括号不匹配"<<endl; return ERROR; } else { p++; break; } } default:p++;//其他字符不处理 } } if ( !S.length ) cout << "括号匹配!"<<endl; else cout << "缺少匹配的右括号!"<<endl; return OK; } int main() { Stack Stk; int elem=0; InitStack( Stk ); for( int i = 0; i < 5; i++ ) Push( Stk, i ); OutStack( Stk ); cout <<"conversion()函数试验:"<<endl; conversion();//试验进制转换函数 cout << endl; cout <<"Parentheses()函数试验:"<<endl; Parentheses(); system("pause"); return 0; } VS2008下编译调试通过